在 C# 中使用 'unnecessary' 局部变量的性能损失?

Performance penalty for using 'unnecessary' local variable in C#?

使用额外的局部变量存储方法的结果是否会降低性能?

public string void ToFunkyDutchDate(DateTime this theDate) {
    var result = string.Format("{0:dd-MM-yyyy}", theDate);
    return result;
}

在类似的微不足道的情况下,我什至可以立即 return 格式化字符串。但这只是一个简单的例子,因为在稍微复杂一点的函数中我经常使用这种'trick'先将结果赋给一个临时局部变量

我这样做的主要原因是这样可以更轻松地进行调试。我可以在 return result; 行上放置一个断点,运行 并检查我的函数得出的结果是否正确。

但是额外的临时 result 变量仍然感觉有点像没有以下选项的性能不佳:"

public static string ToFunkyDutchDate(DateTime this theDate) {
    return string.Format("{0:dd-MM-yyyy}", theDate);
}

我通过三种方式缓解了这种烦人的感觉:

但我已经做了这么多年,写了这么多行代码,我想我终于要问了。这里有知道的编译器向导吗? :)

编辑:一分钟内回答一个酝酿多年的问题。 Whosebug 有多棒。很棒的工具:http://tryroslyn.azurewebsites.net/

通常没有速度差异。例如参见 [​​=10=]

两个版本的代码在发布模式下生成相同的 IL 代码。

在调试模式下,IL 代码稍长(因为对局部变量的存储是显式的):http://goo.gl/KCkORV

我刚刚 运行 通过 LinqPad 的两种方法并查看它提供的 IL 有两个指令的变化:

使用未使用的变量:

IL_0000:  ldstr       "{0:dd-MM-yyyy}"
IL_0005:  ldarg.0     
IL_0006:  box         System.DateTime
IL_000B:  call        System.String.Format
IL_0010:  stloc.0     // result
IL_0011:  ldloc.0     // result
IL_0012:  ret         

直接返回string.Format的结果:

IL_0000:  ldstr       "{0:dd-MM-yyyy}"
IL_0005:  ldarg.0     
IL_0006:  box         System.DateTime
IL_000B:  call        System.String.Format
IL_0010:  ret        

这两个额外的调用会不会是一个性能问题,不太可能,但我很难说我不知道​​这个区域有多重要。