2009-07-15 6 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>タイプStringDictionary型よりそれをより有用にするいくつかの強く型付けされたインターフェース(ICollection<KeyValuePair<TKey, TValue>>IEnumerable<KeyValuePair<TKey, TValue>>)を実装します。

StringDictionaryタイプは、厳密にタイプされたですが、私は怠惰のためにその使用法を助言しません。

+0

はい、そうではありませんが、特殊なStringDictionaryではなく、汎用ディクショナリのではありませんか? 私はなぜ、非常に便利なオーバーロードが特殊なStringDictionaryのために実装されていないのだろうと思っていました。 – Pandincus

+2

ジェネリック型はこの種のコンストラクタを持っていると言っていると思いますが、古い特殊辞書はありません。 – Keltex

+0

@Pandincus:Keltexは正しい - 特殊な辞書はそれが古い型であり、コピーコンストラクタは当時考慮されていなかったので、そのオーバーロードされたコンストラクタはありません。それにもかかわらず、私はあなたが 'Dictionary 'を使用し、 'StringDictionary'を放棄することを強く勧めています。 –

5

あなたが本当にStringDictionaryを(おそらくレガシーアプリケーションをサポートするために)使用する場合は、拡張メソッドを作成することができます

StringDictionary newdict = olddict.NewCopy(); 
1

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

を次に、あなたはこれを行うことができます"string"型をどこにでも入力したくない場合は、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. 
} 

エ出来上がり:あなたは、一般的なタイプのすべての時間を入力して好きではない場合でも、あなたは自分自身のサブクラスを作成することができます!文字列Dictionaryを使用する場合は、代わりにStringDictを使用してください。

+1

私はStrigDictがより魅力的な機能を提供していると思います。 – quillbreaker

+0

ああ、あなた!タイプミスが修正されました。 – Randolpho

+1

エイリアスを使用できます – Marlon

関連する問題