36

C# で型指定された読み取り専用の空のリストを取得する標準的な方法は何ですか?

ETA:「なぜ?」と尋ねる方へ: を返す仮想メソッドがありIList(または、回答後、IEnumerable)、デフォルトの実装は空です。リストへの書き込みはバグになるため、リストが返すものはすべて読み取り専用にする必要があります。誰かがそうしようとした場合は、バグが後で微妙な方法で現れるのを待つのではなく、すぐに停止して発火したいと考えています。

4

8 に答える 8

27

個人的には、これは他のどの回答よりも優れていると思います。

static readonly IList<T> EmptyList = new T[0];
  • 配列は を実装しIList<T>ます。
  • 配列に追加することはできません。
  • 空の配列の要素に代入することはできません (存在しないため)
  • 私の意見では、これは よりもはるかに単純ですnew List<T>().AsReadOnly()
  • (必要に応じて)を返すこともできIList<T>ます。

ちなみに、Enumerable.Empty<T>()私の記憶が正しければ、これは実際に内部で使用されているものです。したがって、理論的には、それを行うこともできます(IList<T>)Enumerable.Empty<T>()(ただし、そうする正当な理由はないと思います)。

于 2011-07-23T20:04:53.817 に答える
24

リストを作成するだけです:

List<MyType> list = new List<MyType>();

空の が必要な場合は、次IEnumerable<T>を使用しますEnumerable.Empty<T>()

IEnumerable<MyType> collection = Enumerable.Empty<MyType>();

本当にreadonly listが必要な場合は、次のようにします。

IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();

ReadOnlyCollection<T>これは、 を実装する を返しますIList<T>

于 2010-10-08T22:38:31.683 に答える
8
IList<T> list = new List<T>().AsReadOnly();

または、必要な場合IEnumerable<>:

IEnumerable<T> sequence = Enumerable.Empty<T>();
于 2010-10-08T22:38:45.940 に答える
4

内容を変更できないリストが必要な場合は、次のようにします。

ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();
于 2010-10-08T22:40:44.720 に答える
2

リストからのインスタンスをSystem.Collections.ObjectModel.ReadOnlyCollection作成します。

List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);
于 2010-10-08T22:40:57.460 に答える
2

Dan Tao の answerを拡張するには、代わりにEnumerable.Empty<T>()指定することで、次の実装を と同じ方法で使用できます。List.Empty<T>()

public static class List
{
    public static IList<T> Empty<T>()
    {
        // Note that the static type is only instantiated when
        // it is needed, and only then is the T[0] object created, once.
        return EmptyArray<T>.Instance;
    }

    private sealed class EmptyArray<T>
    {
        public static readonly T[] Instance = new T[0];
    }
}

編集: 上記のコードを変更して、フィールドの遅延初期化と積極的初期化についてのダン タオとの議論の結果を反映させInstanceます。

于 2012-05-18T20:09:06.527 に答える
-1

どうですか:

readonly List<T> mylist = new List<T>();

読み取り専用にする理由がわかりません。ただし、私が考えることができるほとんどのシナリオでは、それはあまり意味がありません。

于 2010-10-08T22:39:56.560 に答える