ReSharper 通常会告诉我这一点,而且我仍然在寻找为什么这样做的充分理由。
我想到的唯一一件事就是声明它更接近它将使用的范围,可以避免在某些不需要的情况下初始化它(因为条件等)
与此相关的内容如下:
int temp;
foreach (var x in collection) {
temp = x.GetValue();
//Do something with temp
}
这与
有什么不同foreach (var x in collection) {
int temp = x.GetValue();
//...
}
我的意思是,第二个代码不是更昂贵,因为它每次都在分配内存吗?或两者都一样?当然,在完成循环后,在第二个代码中,垃圾收集器将关注temp
变量,但不在第一个...
答案 0 :(得分:6)
声明尽可能接近使用是可读性决定。您的示例不会显示它,但是在较长的方法中,很难筛选代码来查找临时变量。
这也是一种重构优势。声明更接近源会导致以后更容易重构。
答案 1 :(得分:5)
第二个例子的成本可以忽略不计。唯一的区别是,在第一个示例中,temp
将在for
循环的范围之外可用,因此它将比在for
循环内声明它的时间更长。
如果你不在temp
循环之外需要 for
,则不应在该循环之外声明它。就像其他人所说的那样,可读性和风格在性能和记忆方面都比较重要。
答案 2 :(得分:4)
我同意如果你在范围内初始化一个变量,那么你正在帮助gc,但我认为真正的原因更多的是与代码维护最佳实践有关。这种方法可以减少您或其他开发人员在未查看特定块数月(或数年)后返回代码的认知负担。当然,IDE帮助你发现事物,但你仍然需要做“去定义”舞蹈。
答案 3 :(得分:1)
我相信没有性能优势,但更多的是编码风格。它更多的C编程风格在范围的开头声明它。这里有更多详细信息:Scope of variables in C#
答案 4 :(得分:1)
这是一种与可读性有关的风格个人偏好。
很少有语言/系统会对性能产生明显的影响。
我尝试遵循这两条规则。
类的所有核心属性应该在一个地方一起定义。例如如果您正在处理订单,那么orderno,customerno,金额,销售税等应该紧密地定义。
构成类的内部机制的所有技术属性,如迭代器,标志,状态变量,应该被定义为接近其使用。
或者将其他业务/外部类型数据全部定义在一个地方,技术/内部数据定义接近使用。
答案 5 :(得分:1)
不同之处在于编码风格和其中一种争议,即不同的编码标准完全相反。在C ++世界中,冲突仍然是最强的,其中C语言强制变量在范围的开头被声明,因此老前辈(像我一样)习惯于“查看函数的开头”来查找变量。
您经常看到的C#样式是变量在需要它们时就存在了。这种风格限制了变量的存在,并最大限度地减少了意外地意味着其他变量的可能性。我发现它很容易阅读。
在现代C#时代,将变量声明放在第一个使用点时,如果与喜欢和讨厌的var
功能相结合,最明显是有益的。使用var
只是没有那么有用,除非你使用允许编译器和读者推断变量类型的赋值。第一次使用时,var
功能会鼓励声明。
我,我喜欢var
,所以你可以猜出我更喜欢哪种编码风格!
答案 6 :(得分:0)
我总是被教导在函数,类等的顶部声明你的变量。这使得它更容易阅读。