不変クラスの作成に取り組んでいます。
すべてのプロパティを読み取り専用としてマークしました。
クラス内のアイテムのリストがあります。
プロパティが読み取り専用の場合、リストは変更できます。
リストのIEnumerableを公開すると、不変になります。
クラスを不変にするために従わなければならない基本的なルールは何か知りたいですか?
あなたは正しい軌道に乗っていると思う-
不変にするには、すべてのプロパティとフィールドを読み取り専用にする必要があります。そして、リスト内のアイテム自体は不変でなければなりません。
次のように、読み取り専用リストプロパティを作成できます。
public class MyClass
{
public MyClass(..., IList<MyType> items)
{
...
_myReadOnlyList = new List<MyType>(items).AsReadOnly();
}
public IList<MyType> MyReadOnlyList
{
get { return _myReadOnlyList; }
}
private IList<MyType> _myReadOnlyList
}
また、次のことに注意してください。
public readonly object[] MyObjects;
readonlyキーワードでマークされていても不変ではありません。インデックスアクセサーによって個々の配列の参照/値を変更することもできます。
ReadOnlyCollection
クラスを使用します。 System.Collections.ObjectModel
名前空間にあります。
リスト(またはコンストラクター内)を返すものについては、リストを読み取り専用コレクションとして設定します。
using System.Collections.ObjectModel;
...
public MyClass(..., List<ListItemType> theList, ...)
{
...
this.myListItemCollection= theList.AsReadOnly();
...
}
public ReadOnlyCollection<ListItemType> ListItems
{
get { return this.myListItemCollection; }
}
別のオプションは、内部コレクションをまったく公開するのではなく、訪問者パターンを使用することです。