2012-01-11 56 views
7

可能重複:
When do you use code blocks?範圍塊的好處?

好吧,這可能是一個愚蠢的問題,我可能失去了一些東西很明顯,但我慢慢學C#這一直保持現在我嘮叨了一會兒。

下面的代碼編譯明顯就好:

public void Foo() 
{ 
    { 
     int i = 1; 
     i++; 
    } 

    { 
     int i = 1; 
     i--; 
    } 
} 

我明白{}塊可用於確定範圍。問題是你爲什麼要這樣做?這個功能解決了什麼問題?

有沒有危害,我可以使用它們限制,它並添加到一個更加混亂的代碼,因爲這些類型的作用域看可以更容易被忽視相比那些「捆綁」到流的控制,迭代等

+0

case語句是真正有用的地方,所以你不會在循環中重用'i'這樣的錯誤。 – Chad 2012-01-11 18:03:18

回答

6

正是在switch語句在您的變量聲明就會變得更加複雜有用:

混淆代碼:

switch (true) 
{ 
    case true: 
     var msg = "This is true."; 
     var copy = msg; 
     break; 

    case false: 
     msg = "This is false."; 
     copy = msg; 
     break; 
} 

清除代碼:

switch (true) 
{ 
    case true: 
    { 
     var msg = "This is true."; 
     var copy = msg; 
     break; 
    } 

    case false: 
    { 
     var msg = "This is false."; 
     var copy = msg; 
     break; 
    } 
} 
+0

當人們使用額外的換行符等,而不是隻是護腕/塊時,最有趣和愚蠢 – abatishchev 2012-01-11 18:05:27

+1

謝謝!大聲笑我一直在使用它們,因爲我總是用第二種方式寫'switch'語句。關於它的有趣和令人傷心的部分是我認爲我實際上使用的不是匿名塊的「case blocks」......有很多東西需要學習:(... – InBetween 2012-01-11 18:09:12

1

對於像這樣的「裸露」範圍塊,我傾向於同意你的觀點。從語言設計的角度來看,我認爲它們是for,whileif條件下隱含作用域塊的概括,它們更重要。例如:

foreach (var x in foos) { 
    var someMessage = x.ToString(); 
    doSomething(someMessage); 
} 
+0

我完全同意。這引出了爲什麼它首先被允許的問題......這個功能必須有一些優勢。 – InBetween 2012-01-11 18:01:32

+0

@InBetween,相反,爲什麼它不被允許?該語言允許「foreach(var x in foos)語句」,其中'statement'是代碼中的法律聲明。這裏有什麼聲明?一個'{codeblock; }'。我們剛剛確定'{codeblock; }是法律聲明。所以這個問題可能不是爲什麼允許它,但是禁止它的強制性理由是什麼?但是我並沒有將自己的評論與語言規範或其他資源相提並論,所以也許只是把這些看作一堆詞。 – 2012-01-11 18:04:24

0

快速的回答是,它可以防止您以意外的方式無意中更改變量。通過讓它在「範圍內」,只有當你想要而不是「意外」地改變數值時才能採取行動

3

我想說的是,爲了範圍的目的而創建一個人工模塊往往只是令人困惑,正如你注意到的那樣。我從來沒有發現它的需要。

如果有一些需要它,我的猜測是重構成一個單獨的方法通常是一個更好的選擇。

(注意我不是說這是絕對我只是覺得你需要一些真正專業需要有它。)