在退货线上进行变量分配的好处

时间:2013-01-15 15:27:20

标签: c#

如上所述,我很好奇是否有任何好处:

return someNumber = CalculateResults(parameter);

与做:

someNumber = CalculateResults(parameter);
return someNumber;

或做:

return CalculateResults(parameter);

使用其中一个是否有任何表现?

4 个答案:

答案 0 :(得分: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         

第三种情况稍微短一些。我也更喜欢这种方法,因为它比为它分配变量感觉更流畅。我使用变量的唯一原因是尝试通过变量为返回值赋予有意义的名称来“记录”方法的作用。

答案 1 :(得分:1)

前两个之间没有实际好处,但第二个比我认为的第一个更具可读性。

return CalculateResults(parameter);
如果someNumber不以任何方式存在,

会更好,你应该小心。

并且少了一条指令(尽管如果优化器已经为你做了那件事我也不会感到惊讶)

答案 2 :(得分:1)

在单独的行上将有助于雅各布所说的调试。如果您不需要存储/操作返回的数据,那么您应该继续并返回而不分配变量。

答案 3 :(得分:0)

我更喜欢这个

return someNumber = CalculateResults(parameter); 

尽可能。保存一行并在调试时提供帮助。您可以简单地将鼠标悬停在someNumber上以获取返回值。

如果没有进行分配操作,性能增益可以忽略不计。 (无论如何编译器可能会优化它。)