2016-05-11 3 views
3

は不変ではありません。どのようにクラスを不変にするか?あなただけの代わりにan immutable listを公開することができList <>メンバでクラスを作成する方法は不変ですか?ゲッター<code>Students</code>が変更可能なコレクションであるため、例えば、ここで</p> <pre><code>class School { public List<Student> Students {get; private set;} } </code></pre> <p><code>School</code>については

+3

代わりに、[不変リスト](https://msdn.microsoft.com/en-us/library/e78dcd75.aspx)を公開することができます。 – poke

+2

何を制限しますか?コレクションに追加されたコレクションまたはアイテムの初期化? – vendettamit

+1

あなたが不変であることを正確に左右します。各学生にカプセル化されたデータが変更されないようにしますか? –

答えて

5

:もちろん

class School 
{ 
    private readonly List<Student> _students = new List<Student>(); 

    public ReadOnlyCollection<Student> Students 
    { 
     get { return _students.AsReadOnly(); } 
    } 
} 

をこれを行うには、まだStudentオブジェクトには影響しませんので、完全に不変であることを、Studentオブジェクトはに不変であることが必要です。

+1

良い点。深い不変性は深いコピーに似た問題に直面する –

+0

@BradThomasどのようにC#でディープコピーを実装するのですか? C#にはコピーコンストラクタはありません。 – user1899020

+0

階層全体を通してコピーをシリアル化または適用することができます。これは、タイプによっては比較的シンプルで複雑なものになります。 http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specificallyを参照してください –

3

単純にバッキングフィールドをプライベートフィールドにして、パブリックプロパティのゲッターにリストの読み取り専用バージョンを返すようにします。

class School 
{ 
    private List<Student> students; 

    public ReadOnlyCollection<Student> Students 
    { 
     get 
     { 
      return this.students.AsReadOnly() 
     } 

     private set; 
    } 
} 
+0

私は個人的に@ポークの答えを優先したいと思いますプロパティは、コレクションの読み取り専用性を明確に反映しています。 –

+0

@ C.Evenhuis良い点。コードスニペットが更新されました – James

関連する問題

 関連する問題