B. *_*non 22 c# resharper refactoring scope
Resharper推荐这些vars:
List<string> senderDeviceIDList;
string senderDeviceID;
. . .
foreach (var item in PlatypiIds)
{
senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
senderDeviceID = senderDeviceIDList[0];
Run Code Online (Sandbox Code Playgroud)
...可以在内部范围内声明,如下所示:
foreach (var item in PlatypiIds)
{
List<string> senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
string senderDeviceID = senderDeviceIDList[0];
Run Code Online (Sandbox Code Playgroud)
......但那真的"更好"吗?这不会导致变量被声明N次(每个foreach循环一次)吗?
Tig*_*ran 30
这里在性能或内存分配方面没有任何好处,顺便说一下,作用域内部或外部的变量if是在声明中声明IL的.
唯一的好处是可变范围的本地化.将它移动到使用它的范围,这带来的好处如下:
容易重构(可能是最重要的)
可读性.如果你在范围内看到变量,你知道它只在该范围内使用,如果你看到一些显然不在里面的变量,你知道改变它会影响代码的其他部分.所以改变它会带来一些潜在的危险.
简而言之,它是关于您正在编写的代码的可读性和可用性,并不会带来任何性能或内存消耗优势.
这不会导致变量被声明N次(每个foreach循环一次)吗?
逻辑上,从概念的角度来看是的,这就是重点!从逻辑上讲,它们每个循环存在一次,并且在循环范围之外没有任何意义.
作为实现细节,不,它不会导致创建多个局部变量.该方法只有一个变量,它将在一般情况下重新使用(当它被允许时).有一些例外情况,例如当您使用匿名方法关闭变量时,它无法重复使用变量.
请注意,因为C#强制您在使用它们之前初始化所有局部变量,运行时甚至不负责在每次循环后清除它,编译器不会让您重复使用之前的垃圾(除非您明确初始化)它在循环开始时为默认值).