2012-07-19 111 views
4

我遇到过关于浅拷贝和hashtables深层拷贝的文章/解释,我读得越多,我就越困惑。混淆hashtable的浅拷贝

Hashtable ht = new Hashtable(); 
ht.Add("1", "hello"); 

Hashtable ht2 = new Hashtable(); 
ht2 = ht;       // case1: is this shallow copy? 
ht2["1"] = "H2"; 

Hashtable ht3 = new Hashtable(ht); // case2: is this shallow copy? 
ht3["1"] = "H3"; 

Hashtable ht4 = new Hashtable(); 
ht4 = (Hashtable)ht.Clone();  // case3: is this shallow copy? 
ht4["1"] = "H4"; 
  • 案例1:结果,HT含量的变化成为同样有HT2。情况2:结果,ht内容与ht3不同。案例3:结果,与ht4不同的ht内容不同。

如果Case2和Case3是浅拷贝,那么结果是不是应该与Case1相同?

这是否也发生List,ArrayList等?

+3

另外 - 如果你使用的是.NET 3.5,为什么你还在使用'ArrayList'和'Hashtable'?强烈喜欢泛型类型。 – 2012-07-19 11:16:45

+0

hi @JonSkeet,thx用于指出泛型类型。我已经转向泛型。 – 2012-07-20 03:34:37

回答

2

在情况1下,ht2ht均指Hashtable的相同实例。

在情况2和3,ht3ht4指通过复制原始Hashtable条目创建不同对象

请注意,即使采取“深层”复制(创建新映射),您仍然需要复制引用。例如:

var original = new Dictionary<int, StringBuilder>(); 
original[10] = new StringBuilder(); 

var copy = new Dictoinary<int, StringBuilder>(original); 
copy[20] = new StringBuilder(); 

// We have two different maps... 
Assert.IsFalse(original.ContainsKey(20)); 

// But they both refer to a single StringBuilder in the entry for 10... 
copy[10].Append("Foo"); 
Assert.AreEqual("Foo", original[10].ToString()); 
+0

我没有意识到这种行为,直到你在这里指出它(一个很好的例子)。谢谢。 – 2012-07-20 06:10:14