声明在循环外部的循环中使用的变量而不是内部更好吗?有时我会看到在循环中声明变量的示例.这是否有效地导致程序在每次循环运行时为新变量分配内存?或者.NET足够聪明,知道它真的是同一个变量.
例如,请参阅此答案中的以下代码.
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
}
Run Code Online (Sandbox Code Playgroud)
这个修改过的版本会更有效吗?
public static void CopyStream(Stream input, Stream output)
{
int read; //OUTSIDE LOOP
byte[] buffer = new byte[32768];
while (true)
{
read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
}
Run Code Online (Sandbox Code Playgroud) 我已经看到很多关于是否在for循环范围内部或外部声明变量的问题.这是详细讨论的,例如,这里,这里和这里.答案是绝对没有性能差异(相同的IL),但为了清楚起见,在最严格的范围内声明变量是首选.
我对一个稍微不同的情况感到好奇:
int i;
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
与
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
我希望这两种方法在Release模式下编译为相同的IL.然而,这种情况并非如此.我会给你全部的IL,并指出差异.第一种方法有一个本地:
.locals init (
[0] int32 i
)
Run Code Online (Sandbox Code Playgroud)
而第二个只有两个本地,每个for循环计数器一个:
.locals init (
[0] int32 i,
[1] int32 i
) …Run Code Online (Sandbox Code Playgroud) 在这种情况下,哪种更好/优化的方式来声明和使用变量?
int i;
for(i = 0; i < 10; i++)
Console.WriteLine(i);
for(i = 0; i < 100; i++)
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)
要么
for(int i = 0; i < 10; i++)
Console.WriteLine(i);
for(int i = 0; i < 100; i++)
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)