質問

私の制作を不変なクラスです。
が付いていの物件として読み取り専用になります。

私は、リスト内のクラスです。
その後に、プロパティが読み取り専用のリストが可能です。

さIEnumerableのリストで変更できません。
るものを聞いてみたいと思いますの基本的なルールを守るクラスに変更でき?

役に立ちましたか?

解決

んの-

  • すべての情報を注入し、クラスを供給することができます、コンストラクタ
  • すべての性能を有setterかみ
  • る場合、コレクション(または配列)ではコンストラクタに渡されたすべきでコピーを呼び出し側から改良したもので、後
  • まね返りのコレクションはコピーを返しまたは読み取り専用のバージョン(例えば、 ArrayList.読み取り専用 または同等と組み合わせることができること前のポイント 店舗 読み取り専用コピーするときに返される呼び出し側アクセス)を返却します列挙子を使用その他のメソッド/プロパティを読み取りアクセスしコレクション
  • うだが、外観の変更可能なクラス合がつかない場合は、会員は変更可能-そのような場合には、必ずコピーを離れずの状態だしていきたいと考えていを回避する帰国全体が変更可能なオブジェクトのない限り、コピーして、呼び出し側-オプションは返却のみ不変なので"セクション"に変更可能なオブジェクトンのブライアン-ムッセンを私の拡大このポイント

他のヒント

不変であるためには、すべてのプロパティとフィールドは読み取り専用でなければなりません。そして、任意のリスト内の項目自体は不変である必要があります。

次のように、読み込み専用リストプロパティを作ることができます:

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;

は、それが読み取り専用のキーワードでマークされていますしても不変ではありません。あなたはまだ、インデックスアクセサによって、個々の配列の参照/値を変更することができます。

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; }
}

別のオプションではなく、まったくの内部コレクションをさらすのビジターパターンを使用することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top