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

C# 在返回线上进行变量赋值的好处,c#,C#,如上所述,我很好奇这样做是否有好处: return someNumber = CalculateResults(parameter); 与行动相比: someNumber = CalculateResults(parameter); return someNumber; 或做: return CalculateResults(parameter); 使用其中一种方法比使用另一种方法有什么效果吗 前两种方法没有实际的好处,但在我看来,第二种方法比第一种方法更具可读性 return Calcu

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

return someNumber = CalculateResults(parameter);
与行动相比:

someNumber = CalculateResults(parameter);
return someNumber;
或做:

return CalculateResults(parameter);

使用其中一种方法比使用另一种方法有什么效果吗

前两种方法没有实际的好处,但在我看来,第二种方法比第一种方法更具可读性

return CalculateResults(parameter);
如果
someNumber
没有以任何方式持续存在,则情况会更好,您应该小心这一点


并且减少了一条指令(尽管如果优化器已经为您这样做了,我也不会感到惊讶)

前两条指令之间没有实际的好处,但在我看来,第二条指令比第一条指令更具可读性

return CalculateResults(parameter);
如果
someNumber
没有以任何方式持续存在,则情况会更好,您应该小心这一点


并且只需要一条指令(尽管如果优化器已经为您这样做了,我也不会感到惊讶)

而对于主动优化,这三条指令可能都是相同的,但它们会产生稍微不同的结果

第一个和第二个必须在作用域中声明一个变量并返回它,而最后一个则不能。我已尝试编译以下程序:

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         

第三种情况稍微短一点。我也更喜欢这种方法,因为它感觉比为它分配变量更流畅。我使用变量的唯一原因是试图通过变量为返回值指定一个有意义的名称来“记录”该方法所做的事情。

虽然使用主动优化时,这三种方法可能都是相同的,但它们会产生稍微不同的结果,而不会产生任何影响

第一个和第二个必须在作用域中声明一个变量并返回它,而最后一个则不能。我已尝试编译以下程序:

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         

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

在单独的行中使用变量将有助于调试,如Jacob所述。如果您不需要存储/操作返回的数据,那么应该继续返回,而不分配变量

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

我更喜欢这个

return someNumber = CalculateResults(parameter); 
如果可能的话。保存一行代码,并在调试时提供帮助。您只需将鼠标悬停在某个数字上即可获得返回值

如果不执行赋值操作,性能增益(如果有)可以忽略不计。(无论如何,编译器可能会对其进行优化。)

我更喜欢这个

return someNumber = CalculateResults(parameter); 
如果可能的话。保存一行代码,并在调试时提供帮助。您只需将鼠标悬停在某个数字上即可获得返回值



如果不执行赋值操作,性能增益(如果有)可以忽略不计。(无论如何,编译器可能会对其进行优化。)

对我来说更容易阅读,而且它保存了一行代码。@Jacob如何使用它进行调试?当你在线时,变量还没有赋值,当你进入下一行时,return会把你带到层次结构中。@Destrictor我想下一步是方法的关闭
}
。我从来没有使用过第一个版本,看起来很奇怪me@Destrictor,您可以在返回行上设置断点并检查someNumber变量。这对我来说更容易阅读,并且可以保存一行代码。@Jacob如何使用它进行调试?当你在线时,变量还没有赋值,当你进入下一行时,return会把你带到层次结构中。@Destrictor我想下一步是方法的关闭
}
。我从来没有使用过第一个版本,看起来很奇怪me@Destrictor,您可以在返回行上设置断点并检查someNumber变量。这假定
someNumber
是本地变量,而不是字段或属性。@Servy True。但从作者的问题来看,我认为他知道设置局部变量和字段之间有区别,而他的问题只与性能有关。不管怎样,这都是一个很好的观点。从性能的角度来看,一个是设置字段,另一个是进行优化。因为我们不知道他用的是哪一种,所以我们不知道哪一种情况,因此无法给出答案。@Servy我们知道这是最好的情况。对于字段或属性,该方法必须访问传递给它的实例,并将值写入给定字段。不用说,前两种方法的IL更长,但我宁愿避免使用额外的IL块来回答太长的问题。这假设
someNumber
是一个局部的,而不是一个字段或属性。@Servy True。但从作者的问题来看,我认为他知道设置局部变量和字段之间有区别,而他的问题只与性能有关。不管怎样,这都是一个很好的观点。从性能的角度来看,一个是设置字段,另一个是进行优化。因为我们不知道他用的是哪一种,所以我们不知道哪一种情况,因此无法给出答案。@Servy我们知道这是最好的情况。对于字段或属性,该方法必须访问传递给它的实例,并将值写入给定字段。不用说,前两种方法的IL更长——但我宁愿避免用额外的IL块来回答太长的问题。如果
someNumber
是一个字段,而不是一个本地字段,那么不,删除它就不一样了。因此,“If
someNumber
不会以任何方式持续存在。”如果
someNumber
是一个字段,而不是一个本地字段,那么不,删除它就不一样了<