C# · 12月 26, 2021

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); }}解决方法@H_404_13@ 不,这不会更有效率.但是,我会以这种方式重写,这恰好在循环之外声明它: 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 (…) { }}