如前所述,我很好奇这样做是否有任何好处:
return someNumber = CalculateResults(parameter);
与做:
someNumber = CalculateResults(parameter);
return someNumber;
或做:
return CalculateResults(parameter);
使用其中一种是否有任何性能提升?
如前所述,我很好奇这样做是否有任何好处:
return someNumber = CalculateResults(parameter);
与做:
someNumber = CalculateResults(parameter);
return someNumber;
或做:
return CalculateResults(parameter);
使用其中一种是否有任何性能提升?
虽然使用主动优化可能所有三个都是相同的,但如果没有,它们会产生略微不同的结果。
第一个和第二个必须在范围内声明一个变量并返回它,而最后一个不需要。我试图编译以下程序:
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
第三种情况稍微短一些。我也更喜欢这种方法,因为它感觉比为其分配变量更流畅。我使用变量的唯一原因是尝试通过变量为返回值提供一个有意义的名称来“记录”该方法的作用。
前两者之间没有实际的好处,但在我看来,第二个比第一个更具可读性。
return CalculateResults(parameter);
如果不以任何方式坚持,那就更好someNumber
了,你应该小心。
并且少了一条指令(尽管如果优化器已经为你做了那我不会感到惊讶)
像 Jacob 所说的那样,在单独的行上将有助于调试。如果您不需要存储/操作返回的数据,那么您应该继续并返回而不分配变量。
我更喜欢这个
return someNumber = CalculateResults(parameter);
若有可能。节省一行并在您调试时提供帮助。您可以简单地将鼠标悬停在 someNumber 上以获取返回值。
如果不进行分配操作,性能增益(如果有的话)可以忽略不计。(无论如何,编译器可能会对其进行优化。)