2011-01-13 12 views
9

で私はList -propertyといくつかのクラスを持っている:読み取り専用リストのC#

class Foo { 
    private List<int> myList; 
} 

私は読み取り専用のため、このフィールドへのアクセスを提供します。

I.e.私は、Enumerable、Countなどへのアクセス権を持ち、Clear、Add、Removeなどのアクセス権がないプロパティを必要とします。どうすればそれを行うことができますか?

+0

読み込み専用と不変性は関連するトピックが2つありますので、この質問は読み込み専用にすることをお勧めします。不変性を探しているならhttp://stackoverflow.com/a/9009748/58961をチェックしてください。 –

答えて

25

リストの読み取り専用の表示が必要な場合は、ReadOnlyCollection<T>を使用できます。

class Foo { 
    private ReadOnlyCollection<int> myList; 
} 
+3

より正確には、私的な 'List '変数と 'ReadOnlyCollection 'プロパティと 'get {}'プロパティを返します。 –

+3

@ Victor:単純なキャストで呼び出し可能なコードに変更可能なリストへのアクセス権を与えます。おそらく、OPが望んでいるものではないでしょう。 readonlyプロパティは '新しいReadOnlyCollection (myList);を返します。 –

+8

ReadOnlyCollectionは、元のリストへのポインタを含んでいるので、実際には変更できません。リストに何かを追加すると、readOnly-instanceはこの新しい項目にアクセスすることができます...しかし、メソッド - これは欠けている! –

0

クラスに読み取り専用リストを宣言しても、項目を追加することはできます。

何かを追加したり変更したりしない場合は、ダーリンの提案通りにReadOnlyCollection<T>を使用する必要があります。

リストから項目を削除したいが、内容を変更しない場合は、readonly List<T>を使用できます。

9

私はこの方法を使用することによってあなたはReadOnlyCollection<T>としてList<T>を公開することができ

public sealed class Foo 
{ 
    private readonly List<object> _items = new List<object>(); 

    public IEnumerable<object> Items 
    { 
     get 
     { 
      foreach (var item in this._items) 
      { 
       yield return item; 
      } 
     } 
    } 
} 
+4

最後に利回りを悩ますのはなぜですか? –

+0

また、FooはIEnumerable – Turowicz

+0

@Jon Skeetを実装することができました:過去のコピー...最初は '// TODO'でしたが、foreachで置き換えられました...そのヒントのおかげで! –

8

のために行くだろうAsReadOnly()

class Foo { 

    private List<int> myList; 

    public ReadOnlyCollection<int> ReadOnlyList { 
    get { 
     myList.AsReadOnly(); 
    } 
    } 
} 

きちんとした事は、あなたが追加した場合/プライベートリストから何かを削除することです返されたReadOnlyCollectionにも反映されます

+0

まさに私が欲しかった。 – AnthonyVO

5

まさにそれを行う不変のコレクションライブラリがあります。あなたはナゲット経由でインストールできます。

不変なコレクションクラスは、.NET フレームワーク4.5からサポートされています。

https://msdn.microsoft.com/en-us/library/dn385366%28v=vs.110%29.aspx

System.Collections.Immutable名前空間を含む、あなたがこれらのシナリオに使用できる汎用的な不変 コレクション型を、提供: ImmutableArray <T>、 ImmutableDictionary <処理鍵、TValue >、 不変配列辞書<T>、不変ハッシュセット<T>、 ImmutableList <使用のT >、ImmutableQueue <T>、ImmutableSortedSet <T>、 ImmutableStack <T>

例:私は頭を行くとのタイトルを変更するつもりです

class Foo 
{ 
    public ImmutableList<int> myList { get; private set; } 

    public Foo(IEnumerable<int> list) 
    { 
     myList = list.ToImmutableList(); 
    } 
} 
関連する問題