c# – 应该将变量声明总是放在循环之外吗?

前端之家收集整理的这篇文章主要介绍了c# – 应该将变量声明总是放在循环之外吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在循环以外的循环中声明一个变量,而不是内部更好吗?有时我会看到一个变量在循环内被声明的例子.这是否有效地导致程序在循环运行时为新变量分配内存?或者是.NET聪明到足以知道它是真正的变量.

例如,请参阅this answer中的代码.

public static void CopyStream(Stream input,Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer,buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer,read);
    }
}

这个修改版本会更有效吗?

public static void CopyStream(Stream input,Stream output)
{
    int read; //OUTSIDE LOOP
    byte[] buffer = new byte[32768];
    while (true)
    {
        read = input.Read (buffer,read);
    }
}

解决方法

不,这不会更有效率.但是,我会以这种方式重写,这恰好在循环之外声明它:
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer,buffer.Length)) > 0)
{
    output.Write(buffer,read);
}

我通常不是在条件下使用副作用的粉丝,但是有效的是读取方法给你两点数据:你是否已经到达流的末尾,以及你读了多少. while循环现在说:“虽然我们设法读取一些数据…复制它.

这有点像使用int.TryParse:

if (int.TryParse(text,out value))
{
    // Use value
}

您再次使用在该条件下调用方法的副作用.正如我所说,当你处理一个返回两位数据的方法时,除了这种特殊的模式,我不会这样做.

同样的事情从TextReader中读取行:

string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}

回到原来的问题:如果一个变量将在循环的每次迭代中被初始化,并且它只在循环体内使用,我几乎总是在循环中声明它.一个小的例外是如果变量被一个匿名函数捕获 – 在这一点上它将会改变行为,我会选择哪种形式给我所需的行为…但这几乎总是“内部声明“无论如何

编辑:当涉及到范围时,上面的代码确实将变量放在比需要的更大的范围内…但我相信它使得循环更加清晰.您可以随时通过引入新的范围来解决此问题:

{
    int read;
    while (...)
    {
    }
}

猜你在找的C#相关文章