这个“移动声明更接近使用”真的更可取吗?

时间:2012-08-16 16:43:00

标签: c# optimization resharper

  

可能重复:
  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) {
        . . .

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

4 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:8)

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

  1. 信息隐藏。
  2. 更容易理解。
  3. 不太可能将某些事情搞砸了。
  4. 即使看起来变量是在循环上每次迭代时新声明的,但它们是在编译时声明的,而不是运行时。在变量[s]的堆栈帧上分配空间,并且在循环的每次迭代中重用相同的空间。

答案 2 :(得分:4)

是的,但声明它们在运行时不会花费任何时间。它们不会占用更多内存,因为编译器只会重用它们的内存位置。

答案 3 :(得分:2)

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

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