web-dev-qa-db-ja.com

IReadOnlyDictionaryを適切に使用する方法は?

から msdn

キーと値のペアの一般的な読み取り専用コレクションを表します。

ただし、次のことを検討してください。

class Test
{
    public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string>
    {
        { "1", "111" },
        { "2", "222" },
        { "3", "333" },
    };

    public IReadOnlyList<string> List { get; } =
        (new List<string> { "1", "2", "3" }).AsReadOnly();
}

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();

        var dictionary = (Dictionary<string, string>)test.Dictionary; // possible
        dictionary.Add("4", "444"); // possible
        dictionary.Remove("3"); // possible

        var list = (List<string>)test.List; // impossible
        list.Add("4"); // impossible
        list.RemoveAt(0); // impossible
    }
}

IReadOnlyDictionaryDictionaryに簡単にキャストして変更できます(誰でもできます)が、ListにはNiceAsReadOnlyメソッドがあります。

質問:IReadOnlyDictionaryを適切に使用して、実際に読み取り専用辞書を公開するにはどうすればよいですか?

10
Sinatr

.NET 4.5では、使用できる ReadOnlyDictionary タイプが導入されました。既存の辞書を受け入れるコンストラクターがあります。

より低いフレームワークバージョンをターゲットにする場合は、 で説明されているようにラッパーを使用します。NETで使用可能な読み取り専用の汎用辞書はありますか? および C#には不変の辞書を提供する方法がありますか?

後者のクラスを使用する場合、コレクション初期化構文は機能しないことに注意してください。 Add()呼び出しにコンパイルされます。

16
CodeCaster