述べたように、私は行うことの利点があるかどうか興味があります:
return someNumber = CalculateResults(parameter);
対実行:
someNumber = CalculateResults(parameter);
return someNumber;
または実行中:
return CalculateResults(parameter);
どちらか一方を使用することで得られるパフォーマンスはありますか?
述べたように、私は行うことの利点があるかどうか興味があります:
return someNumber = CalculateResults(parameter);
対実行:
someNumber = CalculateResults(parameter);
return someNumber;
または実行中:
return CalculateResults(parameter);
どちらか一方を使用することで得られるパフォーマンスはありますか?
アクティブな最適化を使用すると、おそらく3つすべてが同じになりますが、最適化を行わないと、わずかに異なる結果が生成されます。
最初と2番目はスコープ内で変数を宣言して返す必要がありますが、最後はそうではありません。私は次のプログラムをコンパイルしようとしました:
int Calculate()
{
return 42;
}
int FirstCase()
{
int x;
return x = Calculate();
}
int SecondCase()
{
var x = Calculate();
return x;
}
int ThirdCase()
{
return Calculate();
}
LINQPadを使用した出力:
FirstCase:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: call UserQuery.Calculate
IL_0007: dup
IL_0008: stloc.0 // x
IL_0009: stloc.1 // CS$1$0000
IL_000A: br.s IL_000C
IL_000C: ldloc.1 // CS$1$0000
IL_000D: ret
SecondCase:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: call UserQuery.Calculate
IL_0007: stloc.0 // x
IL_0008: ldloc.0 // x
IL_0009: stloc.1 // CS$1$0000
IL_000A: br.s IL_000C
IL_000C: ldloc.1 // CS$1$0000
IL_000D: ret
ThirdCase:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: call UserQuery.Calculate
IL_0007: stloc.0 // CS$1$0000
IL_0008: br.s IL_000A
IL_000A: ldloc.0 // CS$1$0000
IL_000B: ret
3番目のケースは少し短いです。変数を割り当てるよりも流暢に感じるので、私もそのアプローチを好みます。変数を使用する唯一の理由は、変数を介して戻り値に意味のある名前を付けることにより、メソッドが何をするかを「文書化」しようとすることです。
最初の2つの間に実際的な利点はありませんが、私の意見では、2番目の方が最初の方よりも読みやすくなっています。
return CalculateResults(parameter);
まったく持続しない場合はさらに良いですsomeNumber
、あなたはそれに注意する必要があります。
必要な命令が1つ少なくなります(オプティマイザーがすでにそれを行っていても驚かないでしょうが)
別々の行にあると、Jacobが述べたようにデバッグに役立ちます。返されるデータを保存/操作する必要がない場合は、変数を割り当てずに先に進んで戻る必要があります。
私はこれが好きです
return someNumber = CalculateResults(parameter);
可能であれば。行を保存し、デバッグ時に役立ちます。someNumberにカーソルを合わせるだけで、戻り値を取得できます。
割り当て操作を行わないことによるパフォーマンスの向上は無視できます。(コンパイラーはおそらくそれを最適化するでしょう。)