2009-12-23 187 views
5
try 
{... 
block: 
.... 
} 
catch{ ..} 
GOTO block 
... 
.... 
finally{...} 

在這種情況下會執行嗎?C#.NET中的GOTO語句

+1

你爲什麼要他們? – Pondidum 2009-12-23 11:44:57

+1

'C#.NET',很好... – 2009-12-23 11:45:59

+2

是不是編譯錯誤? – ironic 2009-12-23 11:46:36

回答

13

因「GOTO block」這將無法編譯,而不是「goto block;」即使它是正確的,將不能編譯,因爲C#規格狀態(第8.9.3節):

的目標a goto標識符語句是帶給定標籤的帶標籤的語句。如果具有給定名稱的標籤在當前函數成員中不存在,或者goto語句不在標籤範圍內,則會發生編譯時錯誤。此規則允許使用goto語句將嵌套範圍內的控件轉移出來,但不允許將轉換爲嵌套範圍內的

而且我發現幾個有趣的規格過我:

goto語句不能退出finally塊(第8.10節)。當在finally塊內發生goto語句時,goto語句的目標必須位於相同的finally塊中,否則會發生編譯時錯誤。

和:

goto語句的執行過程如下:

  • 如果goto語句退出一個或多個try塊具有關聯finally塊,>控制最初轉移到最後試圖阻止最內層的陳述。當>並且控制到達finally塊的結束點時,控制轉移到下一個包含try語句的finally子句中。重複這個過程,直到執行了所有中間try語句的finally塊。
  • 控制轉移到goto語句的目標。

後者意味着,如果你有

try 
{ 
    ... 
    goto Label1; 
} 
finally 
{ 
    CloseAll(); 
} 

Label1: 
    MethodB(); 

它實際上將控制權轉移給Label1並執行MethodB()之前調用CloseAll()

使完美的感覺,但我從來沒有想過它...

+0

goto在finally塊內沒有發生 – Fortega 2009-12-23 12:03:28

+0

@Fortega:我的不好,我更新了我的答案 – Regent 2009-12-23 13:46:49

+0

@Regent 其實我有沒有集中在語法上。 我從你的回答中得到我想要的結果 謝謝 – Kiran 2009-12-23 14:49:35

6

編號塊:標籤必須在try之外,以便goto看到它。該代碼甚至不會編譯。你正在測試:)?

+0

沒有人,實際上我的朋友問我這樣的問題,所以我很困惑,所以我想在這裏問問題Stackoverflow – Kiran 2009-12-23 11:52:33

+0

我發現閱讀在這種情況下,C#語言規範非常有用:) – Regent 2009-12-23 12:01:49

+2

當然實際上在Visual Studio中嘗試代碼會給你很多信息。 – 2009-12-23 12:18:27