7

newキーワードを使用する場合と使用しない場合のオブジェクト宣言の経験則はありますか?

List<MyCustomClass> listCustClass = GetList();

また

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
4

9 に答える 9

43

2番目のケースでは、最初の行に新しいオブジェクトを作成して、2番目の行に破棄します。完全に不要です。

于 2009-04-20T16:06:14.233 に答える
18

この場合、最初の例だけが意味をなします。2番目の場合は、作成されたリストをメソッドによって返されたリストにすぐに置き換えるためです。リストを新しい空のリストに初期化することは、そのリストに追加する場合、またはリストを作成するために呼び出しているメソッドが、空のリストを期待する場合に何らかの理由でnull値になる可能性がある場合に意味があります。 。

新しい空のリストへの初期化を使用する例。

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );

また

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
于 2009-04-20T16:05:52.173 に答える
8

あなたのシナリオでは、オブジェクトの実際の作成はGetList()メソッド内で実行されているようです。したがって、最初のサンプルが正しい使用法になります。

作成されると、あなたList<MyCustomClass>はヒープに格納され、あなたlistCustClassは単にその新しいオブジェクトへの参照になります。listCustClassをGetList()の参照ポインターに設定すると、listCustClassは破棄され、返されるものへの参照ポインターに置き換えられGetList()ます(nullになる可能性があります)。これが発生した場合、オリジナルList<MyCustomClass>はまだヒープ内にありますが、オブジェクトがそれを指しているわけではないため、ガベージコレクターがやって来てクリーンアップするまでリソースを浪費します。

2番目の例のように、新しいオブジェクトを作成して放棄するたびに要約すると、ヒープを無用な情報で埋めることによって、本質的にメモリを浪費していることになります。

于 2009-04-20T16:18:01.940 に答える
3

キーワードを使用してnew、オブジェクトの新しいインスタンスを作成します。メソッドが何をするのかはあなたの質問からは明らかではありませんがGetList、おそらくそれは新しいリストを作成する(それによってnewキーワードを別の場所に移動する)か、既存のリストを返す(誰かが使用してある時点で作成した)かのどちらかですnew

于 2009-04-20T16:06:30.270 に答える
3

newキーワードは、基本的にヒープにスペースを割り当てるために使用されます。値型(構造体など)を作成する場合は、newキーワードを使用する必要はありません。ただし、参照変数は、使用する前に新しくする必要があります。

上記の例では、GetList()が、関数内のどこかで作成(新規作成)されたList型の参照を返しているように見えます。したがって、このシナリオでは、新しいことは無意味です。

于 2009-04-20T16:09:37.063 に答える
2

達成していることの意味と明確さを失うことなくインライン化できるのであれば、どうしてもインライン化してください。

編集:そして、私は定期的にインライン化しているので、孤立したオブジェクト参照についても考えていませんでした。ドー。=)

于 2009-04-20T16:06:23.997 に答える
1

経験則はありませんが、ほとんどの場合適用できるという常識があります。

オブジェクトは、作成時にインスタンス化する必要があります。関数は表面上(作成された) IListGetList()を返すため、2番目のコードスニペットはまったく不要です(IListをインスタンス化し、次の行で効果的に破棄します)。

ただし、最初のスニペットは完全に適切です。

于 2009-04-20T16:07:44.523 に答える
0

「宣言するときに新しいものを使うべきか」という観点から考えないでください。

割り当てるときはnewを使用します(これは宣言の一部にすることができます)。

最初の例は正しいですが、2番目の例はランタイムリソースの不必要な浪費です。

于 2009-04-20T16:07:06.197 に答える
0

C#では、クラスのすべてのインスタンスをnewキーワードで作成する必要があります。new現在のコンテキストで使用していない場合は、null参照があるかnew、クラスをインスタンス化するために使用する関数を呼び出しています。

この場合、GetList()を使用newして新しいリストを作成しているようです。

于 2009-04-20T16:09:18.267 に答える