我应该声明变量尽可能接近它们将被使用的范围吗?

时间:2011-05-26 04:13:43

标签: c# variables scope

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变量,但不在第一个...

7 个答案:

答案 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)

我总是被教导在函数,类等的顶部声明你的变量。这使得它更容易阅读。