2

次のコード行があります。

var dmrReceived = new DownloadMessagesReport();

StyleCopとReSharperは、冗長な初期化子を削除することを提案しています。しかし、私がそれを置き換えると

DownloadMessagesReport dmrReceived;

確かに、これはオブジェクトのインスタンスに設定されていないオブジェクト参照を生成しますか?.NET3.5を使用しています。オブジェクトを手動でインスタンス化する必要がなくなりましたか?

次の行は次のとおりです。

dmrReceived = dc.DownloadNewMessages(param, param2, param3);

dcこれは、WCFサービスから生成されたクラスであることは注目に値します。WCFWebDownloadNewMessagesサービスメソッドも同様です。

4

6 に答える 6

12

フィールドの場合は、デフォルト値 (参照型の場合はnull ) に自動的に初期化されます。ただしvar、そうではないと思います。実際にはコードのさらに下でインスタンス化しているため、ここでインスタンス化した値は破棄されます。宣言されている変数を初期化する必要はありません。使用したい場合は使用しvarますが、実際に最初に使用する場所で宣言することをお勧めします。

于 2010-01-08T09:44:06.867 に答える
9

だからあなたのコードは

var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);

2 行目は、1 行目で作成したオブジェクトを埋めませんが、そのオブジェクトを完全に置き換えます。したがって、最初の割り当ては必要ありません (最初のオブジェクトは使用されないため)。これは、R# が警告していることです。

于 2010-01-08T11:18:18.320 に答える
2

dmrReceivedが割り当てられる前にアクセスされた場合にのみ、オブジェクト参照エラーが生成されます。多くの場合、resharper が初期化子が冗長であると言う理由は、可能なすべての実行パスで変数が常に別の値に割り当てられるためです。

すなわち

DownloadMessagesReport dmrReceived;

...

if(condition) {
    dmrReceived = new DownloadMessagesReport();
} else {
    throw new Exception("oh no");
}

return dmrReceived.SomeProperty;

アクセスは、実際に値を持つ必要がSomePropertyあるコード内の最初の場所です。dmrReceivedコードの残りの部分からわかるように、値を割り当てずにそのコード行に到達する方法はありません。したがって、割り当てられた可能性のある初期値は実行パスで使用されず、冗長になります。 .

于 2010-01-08T09:47:12.800 に答える
1

「オブジェクトを手動でインスタンス化する必要はもうありませんか?」

もちろん、オブジェクトを「手動で」インスタンス化する必要があります。それ以外の場合、コンパイラはいつ、どこでインスタンス化するかをどのように知るのでしょうか?

簡単なシナリオは次のとおりです。

MyType x;

if ( EverythingWorkedOut )
    x = new MyType(params);
else
    x = null;

コンパイラが最初にインスタンス化した場合、冗長になり、すべてのコードでオーバーヘッドが増加します。

自分の本能よりも ReSharper やその他のコンピューター インテリジェント機能を信頼しないでください。彼らはいつも正しいとは限りません。

インスタンス化されていないオブジェクトのデフォルト値であるべきx = null;なので、実際に行う必要はありません。

于 2010-01-08T09:47:11.067 に答える