List<T>
を公開して読み取り専用にするにはどうすればよいですか?
これは機能しません:
public List<string> myList {readonly get; private set; }
行っても:
public List<string> myList {get; private set; }
あなたはまだこれを行うことができます:
myList.Add("TEST"); //This should not be allowed
私はあなたが持つことができると思います:
public List<string> myList {get{ return otherList;}}
private List<string> otherList {get;set;}
コンセプトをミックスしていると思います。
public List<string> myList {get; private set;}
isすでに「読み取り専用」。つまり、このクラスの外では、myList
をList<string>
の別のインスタンスに設定することはできません
ただし、「人々がリストを変更できないようにするcontents "のように読み取り専用リストが必要な場合は、ReadOnlyCollection<string>
を公開する必要があります。これは次の方法で実行できます。
private List<string> actualList = new List<string>();
public ReadOnlyCollection<string> myList
{
get{ return actualList.AsReadOnly();}
}
最初のコードスニペットでは、他のユーザーがリストを操作できますが、所有するリストを変更することはできません。 2番目のスニペットでは、他の人は変更できない読み取り専用リストを取得します。
IEnumerableを使用したい
private readonly List<string> _list = new List<string>();
public IEnumerable<string> Values // Adding is not allowed - only iteration
{
get { return _list; }
}
読み取り専用のコレクションが必要な場合は、 ReadOnlyCollection<T>
、ではなくList<T>
:
public ReadOnlyCollection<string> MyList { get; private set; }
IList <>を実装するReadOnlyCollectionを返します
private List<string> myList;
public IList<string> MyList
{
get{return myList.AsReadOnly();}
}
ReadOnlyCollection<T>
というコレクションがあります-あなたが探しているのはそれですか?
ListのAsReadOnly()メソッドを使用して、読み取り専用のラッパーを返すことができます。
private List<string> my_list;
public ReadOnlyCollection<string> myList
{
get { return my_list.AsReadOnly(); }
private set { my_list = value; }
}
private List<string> _items = new List<string>();
public ReadOnlyCollection<string> Items
{
get { return _items.AsReadOnly(); }
private set { _items = value }
}
ここに一つの方法があります
public class MyClass
{
private List<string> _myList;
public ReadOnlyCollection<string> PublicReadOnlyList { get { return _myList.AsReadOnly(); } }
public MyClass()
{
_myList = new List<string>();
_myList.Add("tesT");
_myList.Add("tesT1");
_myList.Add("tesT2");
//(_myList.AsReadOnly() as List<string>).Add("test 5");
}
}
.NET 4.5フレームワークでは、 IReadOnlyList インターフェイスのみを公開できます。何かのようなもの:
private List<string> _mylist;
public IReadOnlyList<string> myList { get {return _myList;} }
または、IListへの不要なキャストを防ぎたい場合
private List<string> _mylist;
public IReadOnlyList<string> myList { get {return new List<string>(_myList);} }
private List<string> myList;
public string this[int i]
{
get { return myList[i]; }
set { myList[i] = value; }
}
リストを使用する理由。あなたが本当に公開したいものはIEnumerableのようです
public IEnumerable<string> myList { get; private set; }
これで、クラスのユーザーはアイテムを読むことができますが、リストは変更できません。
通常のリストを作成することもできますが、IEnumerable型のプロパティを介して公開します
private List<int> _list = new List<int>();
public IEnumerable<int> publicCollection{
get { return _list; }
}
少し遅れますが、それでも、ReadOnlyCollection
ラッパーを使用するのは好きではありません。これは、実行時にアクセスされるとコレクションを変更するためのすべてのメソッドを公開し、すべてNotSupportedException
をスローするためです。つまり、IList
インターフェイスを実装しますが、実行時にこの同じ規約に違反します。
私が実際に不変のリストを公開していることを表現するために、私は通常、カスタムのIIndexable
インターフェースに頼ります。これは、LengthとインデクサーをIEnumerable
に追加します( このCodeProjectの記事 で説明)。そもそもIMHOで行われているはずのラッパーです。