對於goto語句,在c/c++中就已經被不推薦使用了,在java中根本就沒有goto的存在了,為什麼c#中又重新使用goto語句呢?
首先瞭解一下c#中的goto語句用法:
1)基本的作用還是和以前一樣,使用者跳到Label的地方執行語句。
//exp1 有效代碼
{
{
goto labelA;
}
labelA:
}
2)但是在c#中,goto只允許在一個語句塊內跳出,或者在一個語句塊內的一個地方跳到另一個地方;
3)不允許goto從一個語句塊外面跳入一個語句塊內部的。//exp2.1 有效代碼
//goto在同語句塊內跳轉
{
{
goto labelA;
labelA:
}
}
//exp2.2無效代碼
//goto從語句塊外跳入語句塊內【錯誤】
{
{
goto labelA; //錯誤,不允許跳入一個語句塊內部
{
labelA:
}
}
}
4)與goto對應的Label後面必須有跟隨有效語句,即不允許將Label放在一個語句塊的最後面。//exp3 無效代碼
{
{
goto labelA;
}
labelA: //Error: labelA後面應當跟隨有效語句。
}
以上是goto語句的基本用法,而goto在C#中唯一有用的地方就是和switch語句結合起來使用,在其他地方,請記住goto語句也是不被推薦使用的。
瞭解一下switch語句的文法形式:www.elivn.comswitch(expression)
{
case 1:
.. //(1)錯誤文法: 沒有加break語句跳出
case 2:
..
break;
case 3: //(2)正確文法:同樣沒有加break語句跳出
case 4:
.
break;
default:
.
break;
}
//對比一下以上兩處case末尾同樣沒有加break語句,
//但是一處是正確一處是錯誤的,仔細可以看出(1)處case後面跟有語句,(2)處則沒有跟任何語句。
//這樣,我們可以知道,在C#中,(1)的用法是不被允許的,而(2)的用法則是被允許的。
//也就是說,接連的兩個case,如果前面一個case語句後面沒有跟任何有效語句,則會自動跳入到下個case,
//但是如果前一個case語句後面跟有任何有效語句,則不允許直接跳入下面一個case的。
//▲這裡有需要用到goto語句來跳入下一個case了
switch(expression)
{
case 1:
..
goto case 2; //(1)正確文法
case 2:
..
break;
case 3: //(2)正確文法:同樣沒有加break語句跳出
case 4:
.
break;
default:
.
break;
}
//實際上這裡的goto也充當了break的作用了,
//這裡說明一點,C#的switch語句是不允許case和case之間穿越的。只能藉助goto語句來實現這個功能。
//至於為什麼要定義成這樣 ,那應該就是MS的部分大師的編程習慣了。
//PS.c#是允許包含0個語句的switch部分流程式控制制繼續(穿越)執行下一個switch部分。