在返回行上进行变量赋值的好处

本文关键字:赋值 返回 变量 | 更新日期: 2023-09-27 17:53:11

如前所述,我很好奇这样做是否有什么好处:

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上即可获得返回值。

如果不执行赋值操作,性能增益(如果有的话)可以忽略不计。(编译器可能会优化它)