例 1:
SomeObject someObject = new SomeObject();
if (someObject.Method())
{
//do stuff
}
//someObject is never used again
対
例 2:
if (new SomeObject().Method())
{
//do stuff
}
最初の方法を 2 番目の方法よりも使用する利点はありますか、またはその逆ですか?
例 1:
SomeObject someObject = new SomeObject();
if (someObject.Method())
{
//do stuff
}
//someObject is never used again
対
例 2:
if (new SomeObject().Method())
{
//do stuff
}
最初の方法を 2 番目の方法よりも使用する利点はありますか、またはその逆ですか?
少なくとも 3 つの潜在的な利点があります。
読みやすさ: 多くの場合、特に新しい開発者にとっては、最初の例は 2 番目の例の構文よりも明白です。
デバッグ エクスペリエンスの向上: のコンストラクターがSomeObject
例外をスローした場合、最初のケースでは、デバッガーはその行で中断します。2 番目のケースでは、例外がコンストラクターにあるのかメソッドにあるのかが明確ではありません。オブジェクトのブレーク ポイントの設定と値の検査でも同じ問題が発生します。2 番目のケースではこれが難しく、メソッド内にブレーク ポイントを設定する必要があります。
最初のケースでは、その単一の呼び出しの外でオブジェクトを使用できます。1 回の呼び出しに必要なメソッドだけが必要で、オブジェクト参照が不要な場合は、静的メソッドの方が適している可能性があります。
ほとんどの些細なケースでは、コンパイラはとにかくそれを削除します。値型には重要な点があります。それは、値を変数にコピーすると値が複製されるため、大きな変化を表す可能性があるということです。ただし、とにかく可変値型を推奨しないでください。
Single
浮動小数点では、ローカルを使用すると異なる答えが得られるエッジケースがいくつかあります(ネイティブタイプは/などよりも幅が広いDouble
)-これは、デバッグ/リリースで異なる結果を得ることができることも意味します(変数はコンパイラによって削除されます)。
変数がスタック上の値以上のことを実行できる場合もあります。つまり、ラムダ/ anonメソッドに「キャプチャ」されるか、out
/に使用されref
ますが、それが適用されることはめったにありません。
デバッグ中に値を確認できるようにするのに役立ちます (また、オブジェクトが COM 相互運用機能などで処分する必要があるものである場合は、参照を保持することが重要になる可能性があるため、制御された環境でこれを行うことができます)。方法)。
名前が長い場合、または複数レベルのネストがある場合も、読みやすくなります。
読みやすさを向上させるための最初のオプションをお勧めします。例:
var phoneNumberRx = new Regex(@"^\(\d{3}\)\d{3}-\d{4}$");