2012-08-16 36 views
8

可能重复:
Is it better to declare a variable inside or outside a loop?这个“移动声明接近使用”真的更可取吗?

ReSharper的希望我可以改变:

int Platypus; 
string duckBill1; 
string duckBill2; 
string duckBill3; 
. . . 
using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     Platypus = odr.GetInt32("Platypus"); 
     duckBill1 = odr.GetString("duckBill1"); 
     duckBill2 = odr.GetString("duckBill2"); 
     duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

...这样的:

using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     int Platypus = odr.GetInt32("Platypus"); 
     string duckBill1 = odr.GetString("duckBill1"); 
     string duckBill2 = odr.GetString("duckBill2"); 
     string duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

...但以这种方式(至少似乎),变量被声明N次,每次通过while循环一次。 Resharperized方式真的比原来好吗?

回答

16

是的,最好是因为你限制了声明变量的范围。在循环中声明它们不会有性能影响。 Resharper建议这种改变的原因是你没有在循环之外使用它们。

+5

如果你声明它们的循环外,其范围将更为广阔,这意味着它会需要更长的时间才能将其释放。 +1 – 2012-08-16 16:46:57

+1

@AndreCalil不,它不会,因为范围与收集资格无关。 rsbarro说,对性能的影响是零。 – 2012-08-16 16:50:51

+0

@JonHanna对不起,我没有看到收藏的主题。如果你在一个方法的范围上声明了一个变量,它将不会被释放,直到该方法结束。如果范围仅仅是一个循环(就像'while'一样),它会很快被释放。甚至一个空字符串分配内存:http://stackoverflow.com/a/6601485/1484750 – 2012-08-16 16:54:15

2

编译器通常会优化这些表达式,并将变量声明“提升”到循环外部,因为变量本身不依赖于循环条件。这有效地生成了您在第一个示例中演示的代码。

在这种情况下,Resharper的建议只是删除一些冗余的代码行,除了减少它们的预编译范围。

+0

甚至没有任何东西需要解压,声明只是说“当这个名称在这个范围内使用时,它的意思是......”,它不会转换为编译后的代码。但是,如果它被赋予了声明,并且该赋值在循环后面没有被覆盖(无论如何将会改变意义),那么确实最有可能被解除。 – 2012-08-16 16:57:19

4

是的,但声明它们在运行时不需要任何时间。由于编译器只会重用其内存位置,因此它们不占用更多内存。

8

一般来说,将变量声明为尽可能窄的范围是一种很好的编程习惯。原因是:

  1. 信息隐藏。
  2. 更容易理解。 bolluxing得起的
  3. 少的情形产生。

即使它看起来好像变量新近在每次迭代在循环中声明,他们是在编译时宣称,不运行时间。空间在变量[s]的堆栈帧上分配,并且该循环的每次迭代都重复使用相同的空间。

相关问题