web-dev-qa-db-ja.com

List <T>プライベートセットで読み取り専用

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

コンセプトをミックスしていると思います。

public List<string> myList {get; private set;}

isすでに「読み取り専用」。つまり、このクラスの外では、myListList<string>の別のインスタンスに設定することはできません

ただし、「人々がリストを変更できないようにするcontents "のように読み取り専用リストが必要な場合は、ReadOnlyCollection<string>を公開する必要があります。これは次の方法で実行できます。

private List<string> actualList = new List<string>();
public ReadOnlyCollection<string> myList
{
  get{ return actualList.AsReadOnly();}
}

最初のコードスニペットでは、他のユーザーがリストを操作できますが、所有するリストを変更することはできません。 2番目のスニペットでは、他の人は変更できない読み取り専用リストを取得します。

94
Philip Rieck

IEnumerableを使用したい

private readonly List<string> _list = new List<string>();

public IEnumerable<string> Values // Adding is not allowed - only iteration
{
   get { return _list; }
}
11

読み取り専用のコレクションが必要な場合は、 ReadOnlyCollection<T> 、ではなくList<T>

public ReadOnlyCollection<string> MyList { get; private set; }
11
Darin Dimitrov

IList <>を実装するReadOnlyCollectionを返します

private List<string> myList;

public IList<string> MyList
{
  get{return myList.AsReadOnly();}
}
10
Sean

ReadOnlyCollection<T>というコレクションがあります-あなたが探しているのはそれですか?

4
Joe Enos

ListのAsReadOnly()メソッドを使用して、読み取り専用のラッパーを返すことができます。

4
private List<string> my_list;

public ReadOnlyCollection<string> myList
{
    get { return my_list.AsReadOnly(); }
    private set { my_list = value; }
}
4
Tesserex
    private List<string> _items = new List<string>();         

    public ReadOnlyCollection<string> Items

    {

        get { return _items.AsReadOnly(); }

        private set { _items = value }

    }
3
zavaz

ここに一つの方法があります

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

    }
3
Dustin Davis

.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);} }
3
Bohumil Janda
private List<string> myList;

public string this[int i]
{
    get { return myList[i]; }
    set { myList[i] = value; }
}
2
Jonathan Wood

リストを使用する理由。あなたが本当に公開したいものはIEnumerableのようです

public IEnumerable<string> myList { get; private set; }

これで、クラスのユーザーはアイテムを読むことができますが、リストは変更できません。

1
tster

通常のリストを作成することもできますが、IEnumerable型のプロパティを介して公開します

private List<int> _list = new List<int>();

public IEnumerable<int> publicCollection{
   get { return _list; }
}
1
Adam Rackis

少し遅れますが、それでも、ReadOnlyCollectionラッパーを使用するのは好きではありません。これは、実行時にアクセスされるとコレクションを変更するためのすべてのメソッドを公開し、すべてNotSupportedExceptionをスローするためです。つまり、IListインターフェイスを実装しますが、実行時にこの同じ規約に違反します。

私が実際に不変のリストを公開していることを表現するために、私は通常、カスタムのIIndexableインターフェースに頼ります。これは、LengthとインデクサーをIEnumerableに追加します( このCodeProjectの記事 で説明)。そもそもIMHOで行われているはずのラッパーです。

0
Groo