この行には、可変性の 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 のブログ記事で詳細を確認してください。
主なことは、変数が読み取り専用であることと、それが参照するオブジェクトが不変であることを区別する必要があるということです。それらは非常に異なります。