2011-05-26 145 views
6

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变量,但不在第一个代码中。

回答

5

第二个示例的成本可以忽略不计。唯一的区别是,在第一个示例中,temp将在for循环的范围之外提供,因此它的存在时间比您在for循环内声明时间要长。

如果你不需要需要tempfor循环之外,它不应该在循环之外声明。像其他人所说的,可读性和风格在这里比表现和记忆更多。

+0

那么这两个代码之间没有任何性能差异? (它是一个'int',但它可能是一个更复杂的类,它将需要更多空间在内存中......) – 2011-05-26 04:22:22

+0

@Oscar - 除了最小的初始化成本之外,堆栈变量基本上是免费的。 – 2011-05-26 04:25:08

+0

无论如何,编译器可能会将在循环外声明的变量移动到循环之外,所以不,实际上没有任何性能差异。通过在需要它们的范围的开始处声明它们来获得可读性和可维护性。 – 2011-05-26 04:25:17

6

声明尽可能接近以使用是可读性的决定。你的例子没有显示它,但在较长的方法中很难筛选代码来找到临时变量。

这也是一个重构优势。声明离源更近会导致更轻松的重构。

1

我相信没有性能优势,但更多的是编码风格。其更多的C编程风格在范围的开始部分声明它。这里有更多的细节:Scope of variables in C#

4

我同意,如果你在它使用的范围内初始化一个变量,那么你正在帮助gc出来,但我认为真正的原因更多的是与代码维护最佳实践。这是减少对您或其他开发人员在未查看特定块的数月(或数年)后回到代码的认知负担的一种方式。当然,IDE可以帮助你发现事物,但你仍然需要做“定义”舞蹈。

+0

同意。希望这将是最好的原因之一':)' – 2011-05-26 04:20:14

+0

我想澄清一下为什么它可以减少认知负荷,以防万一有人好奇。其他开发人员不必考虑使用“temp”的地方。它有助于为该变量提供上下文。 – bowserm 2016-12-20 17:54:44

0

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

+3

你用什么语言呢? – 2011-05-26 04:23:06

1

它的风格个人喜好与可读性有关。

很少有语言/系统会对性能产生显着影响。

我尝试遵循这两条规则。

一个类的所有核心属性应该一起定义在一个地方。例如如果您正在处理订单,那么orderno,customerno,金额,销售税等应该一起定义。

构成类内部机制的一部分的所有技术属性,例如迭代器,标志,状态变量应该被定义为接近它们的用法。或者把它定义在另一个地方的另一个业务/外部类型的数据,技术/内部数据定义为接近使用。

1

不同之处在于编码风格的问题和不同编码标准完全相反的规则之一。在C语言世界中,冲突依然最强烈,C语言强制变量在范围的开始处被声明,所以老时(比如我)习惯于“查看函数的开始”来找到变量。

你最经常看到的C#风格是变量在它们需要的地方正确存在。这种风格限制了变量的存在并最大限度地减少了偶然意味着其他变量的可能性。我发现它很容易阅读。

在现代C#时代,将变量的声明放在第一个使用位置时,与被爱和恨的var功能相结合,显然是非常有益的。使用var只是没有那么有用,除非您将它与允许编译器和读取器推断变量类型的赋值一起使用。 var功能鼓励首次使用声明。

我,我爱var,所以你可以猜测我喜欢哪种编码风格!

相关问题