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>();
_
読み取り専用リストが本当に必要な場合は、次のようにすることができます。
_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>();
.net 4.6以降では、次のものも使用できます。
IList<T> emptyList = Array.Empty<T>();
これにより、Tとして指定したさまざまなタイプごとに1回だけ新しいインスタンスが作成されます。
内容を変更できないリストが必要な場合は、次のようにすることができます。
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の回答 を拡張するには、代わりに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
フィールドの怠惰な初期化と熱心な初期化に関するDanTaoとの話し合いの結果を反映します。