Person クラスがあるとします:
public class Person
{
public string Name { get; set;}
public IEnumerable<Role> Roles {get; set;}
}
明らかに、コンストラクターで Roles をインスタンス化する必要があります。以前は、次のように List を使用してこれを実行していました。
public Person()
{
Roles = new List<Role>();
}
System.Linq
しかし、名前空間でこの静的メソッドを発見しました
IEnumerable<T> Enumerable.Empty<T>();
からマイクロソフト:
メソッド
Empty(TResult)()
は、 型の空のシーケンスをキャッシュしますTResult
。返されるオブジェクトが列挙されると、要素は生成されません。場合によっては、このメソッドは、 を受け取るユーザー定義メソッドに空のシーケンスを渡すのに役立ちます
IEnumerable(T)
。また、 などのメソッドに中立要素を生成するためにも使用できますUnion
。 の使用例については、「例」セクションを参照してください。
では、コンストラクターをそのように記述する方が良いのでしょうか? それを使用していますか? その理由は? そうでない場合は、なぜ使用しないのですか?
public Person()
{
Roles = Enumerable.Empty<Role>();
}
ベストアンサー1
ほとんどの投稿は要点を見逃していると思います。空の配列や空のリストを使用した場合でも、それらはオブジェクトであり、メモリに保存されます。ガベージ コレクターがそれらを処理する必要があります。高スループットのアプリケーションを扱っている場合、顕著な影響が出る可能性があります。
Enumerable.Empty
呼び出しごとにオブジェクトを作成しないため、GC への負荷が軽減されます。
ただし、コードが低スループットの場所にある場合は、最終的には美観上の考慮事項になります。