2012-07-19 114 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