相关疑难解决方法(0)

变量声明是否应该放在循环之外?

声明在循环外部的循环中使用的变量而不是内部更好吗?有时我会看到在循环中声明变量的示例.这是否有效地导致程序在每次循环运行时为新变量分配内存?或者.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)

.net c# loops variable-declaration

9
推荐指数
1
解决办法
1531
查看次数

重用for循环迭代变量

我已经看到很多关于是否在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)

.net c# performance cil

4
推荐指数
1
解决办法
639
查看次数

在此方案中声明和使用变量的有效方法

在这种情况下,哪种更好/优化的方式来声明和使用变量?

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)

c# optimization coding-style

0
推荐指数
1
解决办法
132
查看次数