new
キーワードを使用する場合と使用しない場合のオブジェクト宣言の経験則はありますか?
List<MyCustomClass> listCustClass = GetList();
また
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
new
キーワードを使用する場合と使用しない場合のオブジェクト宣言の経験則はありますか?
List<MyCustomClass> listCustClass = GetList();
また
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
2番目のケースでは、最初の行に新しいオブジェクトを作成して、2番目の行に破棄します。完全に不要です。
この場合、最初の例だけが意味をなします。2番目の場合は、作成されたリストをメソッドによって返されたリストにすぐに置き換えるためです。リストを新しい空のリストに初期化することは、そのリストに追加する場合、またはリストを作成するために呼び出しているメソッドが、空のリストを期待する場合に何らかの理由でnull値になる可能性がある場合に意味があります。 。
新しい空のリストへの初期化を使用する例。
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );
また
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
あなたのシナリオでは、オブジェクトの実際の作成はGetList()
メソッド内で実行されているようです。したがって、最初のサンプルが正しい使用法になります。
作成されると、あなたList<MyCustomClass>
はヒープに格納され、あなたlistCustClass
は単にその新しいオブジェクトへの参照になります。listCustClassをGetList()
の参照ポインターに設定すると、listCustClass
は破棄され、返されるものへの参照ポインターに置き換えられGetList()
ます(nullになる可能性があります)。これが発生した場合、オリジナルList<MyCustomClass>
はまだヒープ内にありますが、オブジェクトがそれを指しているわけではないため、ガベージコレクターがやって来てクリーンアップするまでリソースを浪費します。
2番目の例のように、新しいオブジェクトを作成して放棄するたびに要約すると、ヒープを無用な情報で埋めることによって、本質的にメモリを浪費していることになります。
キーワードを使用してnew
、オブジェクトの新しいインスタンスを作成します。メソッドが何をするのかはあなたの質問からは明らかではありませんがGetList
、おそらくそれは新しいリストを作成する(それによってnew
キーワードを別の場所に移動する)か、既存のリストを返す(誰かが使用してある時点で作成した)かのどちらかですnew
。
newキーワードは、基本的にヒープにスペースを割り当てるために使用されます。値型(構造体など)を作成する場合は、newキーワードを使用する必要はありません。ただし、参照変数は、使用する前に新しくする必要があります。
上記の例では、GetList()が、関数内のどこかで作成(新規作成)されたList型の参照を返しているように見えます。したがって、このシナリオでは、新しいことは無意味です。
達成していることの意味と明確さを失うことなくインライン化できるのであれば、どうしてもインライン化してください。
編集:そして、私は定期的にインライン化しているので、孤立したオブジェクト参照についても考えていませんでした。ドー。=)
経験則はありませんが、ほとんどの場合適用できるという常識があります。
オブジェクトは、作成時にインスタンス化する必要があります。関数は表面上(作成された) IListGetList()
を返すため、2番目のコードスニペットはまったく不要です(IListをインスタンス化し、次の行で効果的に破棄します)。
ただし、最初のスニペットは完全に適切です。
「宣言するときに新しいものを使うべきか」という観点から考えないでください。
割り当てるときはnewを使用します(これは宣言の一部にすることができます)。
最初の例は正しいですが、2番目の例はランタイムリソースの不必要な浪費です。
C#では、クラスのすべてのインスタンスをnew
キーワードで作成する必要があります。new
現在のコンテキストで使用していない場合は、null参照があるかnew
、クラスをインスタンス化するために使用する関数を呼び出しています。
この場合、GetList()を使用new
して新しいリストを作成しているようです。