2010-06-18 54 views
2

我发现自己经常会限制范围。我发现它使代码更清晰,并且允许我更容易地重用变量。这在C中特别方便,其中必须在新范围的开始处声明变量。为什么我看不到更加频繁的更严格的范围界定?

这里是我的意思的一个例子。

{ 
     int h = 0; 
     foreach (var item in photos) 
     { 
      buffer = t.NewRow(); 
      h = item.IndexOf("\\x\\"); 
      buffer["name"] = item.Substring(h, item.Length - h); 
      t.Rows.Add(buffer); 
     } 
} 

有了这个例子中,我限制h的范围内,在不每次迭代初始化。

但我没有看到许多其他开发者经常这样做。这是为什么?这样做有缺点吗?

+4

“这在C中特别方便,其中必须在新范围的开始处声明变量。” C99已经出现了十多年了...... – 2010-06-18 05:48:45

+0

@Matthew:不幸的是,作为一个人,我仍然有时在MSVC中使用C语言工作,并且它不支持与C语句混合使用声明的事实是一个真正的刺激物。 – 2010-06-18 05:58:26

+2

是的,微软已经[非常清楚](http://connect.microsoft.com/VisualStudio/feedback/details/485416/support-c99)他们无意支持现代C标准。然而,让人们认识到标准和许多编译器(GCC,clang,icc等)是非常重要的。)提供此功能。 – 2010-06-18 06:16:53

回答

5

那么,在这种情况下,你在每次迭代反正分配一个新的值,而不使用“老”的价值 - 所以我会用:

foreach (var item in photos) 
{ 
    buffer = t.NewRow(); 
    int h = item.IndexOf("\\x\\"); 
    buffer["name"] = item.Substring(h, item.Length - h); 
    t.Rows.Add(buffer); 
} 

我发现,如果我这样做尽可能积极地进行(理所当然),我没有太多的方法来确定范围问题 - 如果我这样做,可能意味着方法太长,我应该重构它。

我敢说它可以在老C风格有益的 - 但是当我在写C#,我认为没有理由做的事情,在C,但是不会提高我的C#:)

3

大多数发展者对于范围界定都相当粗心。我曾与开发人员合作,尽可能确保一切尽可能高,以避免分配“额外”变量。这通常是由于人们认为thye节省内存是因为thye不理解堆栈变量。尽管如此,尽管通过在foreach循环之外初始化变量而获得的储蓄是最小的,但我可能不会感到困扰。

+3

+1用于识别每次迭代不需要重新声明的最小节约 – 2010-06-18 06:02:04

3

即使您使用的是C版的,仍然需要变量块声明之前声明,下面将在非调试版本没有不良绩效的影响:

foreach (var item in photos) 
    { 
     int h = 0; 
     buffer = t.NewRow(); 
     h = item.IndexOf("\\x\\"); 
     buffer["name"] = item.Substring(h, item.Length - h); 
     t.Rows.Add(buffer); 
    } 

的编译器会认识到h的'初始化'没有被实际使用,所以它不会执行它(甚至在循环的第一次迭代中)。编译器也不会打扰甚至重新分配h(它可能仅仅是一个寄存器)。

但是,如果h是C++中的一个对象类型,它具有构造函数/析构函数来执行编译器无法优化的工作,则可能会付出代价将h的声明提取出循环。

2

与其他人指出的一样,这个例子很糟糕。

否则,范围并没有被使用,因为无论哪里都有意义 - 编写一个函数更有意义。

相关问题