2010-06-18 23 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

與其他人指出的一樣,這個例子很糟糕。

否則,範圍並沒有被使用,因爲無論哪裏都有意義 - 編寫一個函數更有意義。

相關問題