c# – 应该将变量声明总是放在循环之外吗?
发布时间:2020-12-15 04:07:38 所属栏目:百科 来源:网络整理
导读:在循环以外的循环中声明一个变量,而不是内部更好吗?有时我会看到一个变量在循环内被声明的例子.这是否有效地导致程序在循环运行时为新变量分配内存?或者是.NET聪明到足以知道它是真正的变量. 例如,请参阅this answer中的代码. public static void CopyStre
在循环以外的循环中声明一个变量,而不是内部更好吗?有时我会看到一个变量在循环内被声明的例子.这是否有效地导致程序在循环运行时为新变量分配内存?或者是.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 (...) { } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |