2009-07-15 20 views
2

我道歉,如果這是一個愚蠢的問題,但聽我說:在C#.NET中,StringDictionary沒有複製構造函數的原因是什麼?

Dictionary<string, string> genericDict = new Dictionary<string, string>; 
genericDict.Add("blah", "bloop"); 
// Use the copy constructor to create a copy of this dictionary 
return new Dictionary<string, string>(genericDict); 

在上面的代碼示例中,我可以創建一個通用字典的副本。

現在假設我正在使用System.Collections.Specialized.StringDictionary,因爲我不想在任何地方輸入「字符串」類型。 StringDictionary沒有拷貝構造函數!實際上,它只有默認的構造函數。

當然,我可以通過StringDictionary迭代和手動添加每個鍵/值對的,但我不想:-P

爲什麼沒有拷貝構造函數?我在這裏錯過了什麼嗎?

回答

9

StringDictionary類型相當陳舊。我認爲Dictionary<String,String>是你想在這裏使用。

Dictionary<TKey,TValue>類型實現了一些強類型接口(ICollection<KeyValuePair<TKey, TValue>>IEnumerable<KeyValuePair<TKey, TValue>>),這使得它比StringDictionary類型更有用。

雖然StringDictionary類型強類型我不會建議它爲懶惰單獨使用。

+0

是的,但不是泛型Dictionary ,而不是專門的StringDictionary? 我只是想知道爲什麼這個非常方便的重載沒有實現專門的StringDictionary。 – Pandincus 2009-07-15 15:09:06

+2

我想他是說泛型類型有這樣的構造函數,但舊的專業詞典沒有。 – Keltex 2009-07-15 15:09:42

5

如果你真的想使用StringDictionary(也許是爲了支持遺留應用程序),您可以創建一個擴展方法:

public static StringDictionary NewCopy(this StringDictionary olddict) 
{ 
    var newdict = new StringDictionary(); 
    foreach (string key in olddict.Keys) 
    { 
     newdict.Add(key, olddict[key]); 
    } 
    return newdict; 
} 

然後,你可以這樣做:

StringDictionary newdict = olddict.NewCopy(); 
1

如果您不想在任何地方鍵入「字符串」類型,但對Dictionary<string,string>感到滿意,則創建一個新類,其子類Dictionary<string,string>,並且不會覆蓋任何方法。你甚至可以稱它爲StringDictionary,只要它在不同的名字空間中。

2

我同意共識 - 你最好用Dictionary<string, string>。但是,如果你不喜歡打字的泛型類型的時候,你可以創建自己的子類:

public class StringDict : Dictionary<string, string> 
{ 
    // duplicate all Dictionary's constructors here, calling the base constructor for each. 
} 

的Et瞧!無論何時您想使用字符串Dictionary,您都可以使用StringDict代替。

相關問題