C# で型指定された読み取り専用の空のリストを取得する標準的な方法は何ですか?
ETA:「なぜ?」と尋ねる方へ: を返す仮想メソッドがありIList
(または、回答後、IEnumerable
)、デフォルトの実装は空です。リストへの書き込みはバグになるため、リストが返すものはすべて読み取り専用にする必要があります。誰かがそうしようとした場合は、バグが後で微妙な方法で現れるのを待つのではなく、すぐに停止して発火したいと考えています。
C# で型指定された読み取り専用の空のリストを取得する標準的な方法は何ですか?
ETA:「なぜ?」と尋ねる方へ: を返す仮想メソッドがありIList
(または、回答後、IEnumerable
)、デフォルトの実装は空です。リストへの書き込みはバグになるため、リストが返すものはすべて読み取り専用にする必要があります。誰かがそうしようとした場合は、バグが後で微妙な方法で現れるのを待つのではなく、すぐに停止して発火したいと考えています。
個人的には、これは他のどの回答よりも優れていると思います。
static readonly IList<T> EmptyList = new T[0];
IList<T>
ます。new List<T>().AsReadOnly()
。IList<T>
ます。ちなみに、Enumerable.Empty<T>()
私の記憶が正しければ、これは実際に内部で使用されているものです。したがって、理論的には、それを行うこともできます(IList<T>)Enumerable.Empty<T>()
(ただし、そうする正当な理由はないと思います)。
リストを作成するだけです:
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>
。
IList<T> list = new List<T>().AsReadOnly();
または、必要な場合IEnumerable<>
:
IEnumerable<T> sequence = Enumerable.Empty<T>();
内容を変更できないリストが必要な場合は、次のようにします。
ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();
リストからのインスタンスをSystem.Collections.ObjectModel.ReadOnlyCollection
作成します。
List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);
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
ます。
どうですか:
readonly List<T> mylist = new List<T>();
読み取り専用にする理由がわかりません。ただし、私が考えることができるほとんどのシナリオでは、それはあまり意味がありません。