不変クラスの作成に取り組んでいます。
すべてのプロパティを読み取り専用としてマークしました。
クラスのアイテムのリストがあります。
ただし、プロパティが読み取り専用の場合、リストは変更できます。
リストの IEnumerable を公開すると、不変になります。
クラスを不変にするために従わなければならない基本的なルールは何ですか?
不変クラスの作成に取り組んでいます。
すべてのプロパティを読み取り専用としてマークしました。
クラスのアイテムのリストがあります。
ただし、プロパティが読み取り専用の場合、リストは変更できます。
リストの 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
}
Also, keep in mind that:
public readonly object[] MyObjects;
is not immutable even if it's marked with readonly keyword. You can still change individual array references/values by index accessor.
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; }
}
もう 1 つのオプションは、内部コレクションをまったく公開する代わりに、ビジター パターンを使用することです。