不,“变量”的存在几乎完全是为了程序员。通过在方法中声明变量,您不会在运行时创建任何额外的工作。
理论上,当为该方法中声明的每个变量调用方法时,编译器会在堆栈上留出空间。因此,该方法中该变量的存在将比其范围更重要。除非使用 new 关键字,否则不会在堆上分配空间。
实际上,编译器可以识别具有如此短范围的变量,以至于它们可以存储在 CPU 上的寄存器中,而不需要堆栈空间。例如:
var a = b[c];
a.ToString();
// never access "a" again.
... 将等同于:
b[c].ToString();
...因为编译器认识到它只需要存储 b[c] 的结果足够长的时间来调用它的方法,所以它可以只使用 CPU 寄存器而不是使用内存。
因此,在循环inside 中声明变量实际上可能会导致方法为变量分配less 堆栈空间,具体取决于之后可能的逻辑流程。然而,这涉及到对大多数人来说没有任何意义的巨大的微优化。
更新
由于有些人似乎仍然认为在循环中声明变量有一些效果,我想我需要提供证据。在 LINQPad 中键入以下程序。
int j;
for(int i = 0; i < 5; i++)
{
j = i;
}
...和...
for(int i = 0; i < 5; i++)
{
int j = i;
}
执行代码,然后进入IL选项卡查看生成的IL代码。这两个程序都是一样的:
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: br.s IL_0008
IL_0004: ldloc.0
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ldc.i4.5
IL_000A: blt.s IL_0004
因此,有无可争辩的证据表明这在编译时不会产生任何影响。您将从这两个程序中获得完全相同的编译 IL。