0

現在、 ReSharperを使用して C# コードのレビューを行っています。このコードは、.NET 4.0 フレームワークを対象として書かれています。

ここでの私の質問は、宣言中にIEventAggregator (または) Dictionary変数型で修飾子 ' readonly 'を使用できますか? ReSharper からこれを行うように何度も提案されてきました。

私はこの記事を読みました.NETで利用可能な読み取り専用の汎用辞書はありますか? ただし、修飾子「 readonly 」の使用については説明していません。よろしくお願いします。

4

1 に答える 1

3

この行には、可変性の 2 つの側面があります (例として)。

private readonly List<string> names = new List<string>();

names変数は読み取り専用です。その値を変更することはできません (コンストラクター以外で)。したがって、次のような方法があるとします。

public void ResetNames(List<string> newNames)
{
    names = newNames; // Error!
}

それはコンパイルされません。それが変数です

次に、変数の値が参照するオブジェクト (この場合はList<T>. そのオブジェクトは変更可能です...その中のデータを変更できます。だからこれはいいです:

public void AddName(string name)
{
    names.Add(name);
}

現在、一部の型 ( などstring) はそれ自体が不変であるため、オブジェクト内のデータを変更することもできません。ただし、これらの両極端よりも複雑になります。たとえば、そのオブジェクトReadOnlyCollection<T>を変更するために何もできないという点で不変ですが(たとえば、呼び出し元に公開しても安全であることを意味します)、それ自体が変更可能なコレクションをラップできます。

List<string> mutable = new List<string>();
ReadOnlyCollection<string> funky = new ReadOnlyCollection<string>(mutable);
Console.WriteLine(funky.Count); // 0
mutable.Add("xyz");
Console.WriteLine(funky.Count); // 1

不変性には、それ以外にもさまざまな種類があります。たとえば、Eric Lippert のブログ記事で詳細を確認してください。

主なことは、変数が読み取り専用であることと、それが参照するオブジェクトが不変であることを区別する必要があるということです。それらは非常に異なります。

于 2013-07-15T16:19:59.313 に答える