で私はList
-propertyといくつかのクラスを持っている:読み取り専用リストのC#
class Foo {
private List<int> myList;
}
私は読み取り専用のため、このフィールドへのアクセスを提供します。
I.e.私は、Enumerable、Countなどへのアクセス権を持ち、Clear、Add、Removeなどのアクセス権がないプロパティを必要とします。どうすればそれを行うことができますか?
で私はList
-propertyといくつかのクラスを持っている:読み取り専用リストのC#
class Foo {
private List<int> myList;
}
私は読み取り専用のため、このフィールドへのアクセスを提供します。
I.e.私は、Enumerable、Countなどへのアクセス権を持ち、Clear、Add、Removeなどのアクセス権がないプロパティを必要とします。どうすればそれを行うことができますか?
リストの読み取り専用の表示が必要な場合は、ReadOnlyCollection<T>
を使用できます。
class Foo {
private ReadOnlyCollection<int> myList;
}
より正確には、私的な 'List
@ Victor:単純なキャストで呼び出し可能なコードに変更可能なリストへのアクセス権を与えます。おそらく、OPが望んでいるものではないでしょう。 readonlyプロパティは '新しいReadOnlyCollection
ReadOnlyCollectionは、元のリストへのポインタを含んでいるので、実際には変更できません。リストに何かを追加すると、readOnly-instanceはこの新しい項目にアクセスすることができます...しかし、メソッド - これは欠けている! –
クラスに読み取り専用リストを宣言しても、項目を追加することはできます。
何かを追加したり変更したりしない場合は、ダーリンの提案通りにReadOnlyCollection<T>
を使用する必要があります。
リストから項目を削除したいが、内容を変更しない場合は、readonly List<T>
を使用できます。
私はこの方法を使用することによってあなたは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;
}
}
}
}
最後に利回りを悩ますのはなぜですか? –
また、FooはIEnumerable – Turowicz
@Jon Skeetを実装することができました:過去のコピー...最初は '// TODO'でしたが、foreachで置き換えられました...そのヒントのおかげで! –
のために行くだろうAsReadOnly()
class Foo {
private List<int> myList;
public ReadOnlyCollection<int> ReadOnlyList {
get {
myList.AsReadOnly();
}
}
}
きちんとした事は、あなたが追加した場合/プライベートリストから何かを削除することです返されたReadOnlyCollectionにも反映されます
まさに私が欲しかった。 – AnthonyVO
まさにそれを行う不変のコレクションライブラリがあります。あなたはナゲット経由でインストールできます。
不変なコレクションクラスは、.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();
}
}
読み込み専用と不変性は関連するトピックが2つありますので、この質問は読み込み専用にすることをお勧めします。不変性を探しているならhttp://stackoverflow.com/a/9009748/58961をチェックしてください。 –