1. 程式人生 > >C#基礎之流程控制語句詳解

C#基礎之流程控制語句詳解

集合 必須 清晰 循環 remove 很難 使用 fault code

C#程序的執行都是一行接一行、自上而下地進行,不遺漏任何代碼。為了讓程序能按照開發者所設計的流程進行執行,必然需要進行條件判斷、循環和跳轉等過程,這就需要實現流程控制。C#中的流程控制包含了條件語句、循環語句、跳轉語句和異常處理四個方面。
一、跳轉語句
break語句:終止並跳出循環體。

continue語句:終止當前循環,重新開始一個新的循環。

goto語句:跳轉到指定位置。
C#允許給代碼行加上標簽,這樣就可以使用goto語句直接跳轉到這些代碼行上。goto語句的用法如下:
goto<labelName>;
標簽用下述方式定義:
<labelName>:
goto語句有兩個限制,不能跳轉到像for循環這樣的代碼塊中,也不能跳出類的範圍,不能退出try…catch語句後面的finally塊。
這裏講解goto語句只為了解其語法,當遇到時能知道代碼的意思,本人不建議使用。

return語句:跳出循環及其包含的函數。

throw語句:拋出一個異常。

二、條件語句
條件語句可以根據條件是否滿足或者根據表達式的值控制代碼的執行分支。C#有兩種控制控制代碼分支的結構,分別是if語句和switch語句。
if語句
註意:if語句的條件可以是布爾變量,也可以是表達式,但如果是表達式,則表達式得到的結果必須是布爾值。
1、單選擇if語句,即條件成立執行,語法如下:
if(條件)
{
do;
}

2、ifelse語句,即條件成立執行A否則執行B,語法如下:
if(條件)
{
do A;
}
else
{
do B;
}
延伸:三元運算符?:也相當於一個ifelse語句,語法如下:<表達式> ? <resultIfTrue> : <resultIfFalse> 其中計算表達式可得到一個布爾值,
運算符的結果根據這個值來確定是<resultIfTrue>,還是<resultIfFalse>。例:

            int a = 8;
            string b = (a < 10) ? "小於10" : "大於10";

3、多選擇if語句,即對多個條件進行判斷,成立的執行,語法如下:
if(條件1)
{
do A;
}
else if(條件2)
{
do B;
}
else if(條件3)
{
do C;
}
else
{
do D;
}
其中else if語句的個數不受限制,但是如果else if語句的個數較多,則應該考慮另一種分支結構:switch語句。
註意:多選擇if語句自上而下,只要有一個條件成立就不會去判斷其它任何條件。

switch語句
switch…case語句適合於從一組互斥的分支中選擇一個執行分支。其形式是switch參數的後面跟一組case子句。如果switch參數中表達式的值等於某個case子句旁邊的某個值,就執行該case子句中的代碼。此時不需要使用花括號把語句組合到塊中,只需使用break語句標記每段case代碼的結尾即可。也可以在switch語句中包含一條default子句,如果表達式不等於任何case子句的值,就執行default子句的代碼。其語法如下:
switch(表達式)
{
case 1:
Console.WriteLine("1");
break;
case 2:
Console.WriteLine("2");
break;
case 3:
Console.WriteLine("3");
break;
default:
Console.WriteLine("4");
break;
}
註意:switch語句每個case語句後面的值必須與表達式所得到的值的類型相同,而且必須是常量,不能是變量;switch語句中所有case語句後面的值必須是互斥的,也就是說case後面的值不能存在兩個相同的值,因為所有case語句後面的值必須是互斥的,所以case語句的排放順序無關緊要,甚至可以把default語句放在最前面!但是為養成良好的編程習慣和代碼有清晰的邏輯,我不建議這樣寫;switch語句中default語句只能存在一個,不能存在多個;通常情況下,每個case後面都必須有一個break語句,break語句作用是中斷switch語句的執行,但C#中也可以使用其它中斷語句來中斷switch語句的執,如return語句、goto語句。使用break語句和return語句來中斷是有區別的,break語句僅僅中斷switch語句的執行,如果switch語句後面還有其它代碼是可以繼續執行的,但是return語句中斷則會中斷switch語句所在的方法,也就是說switch語句後面的代碼將不會執行,switch語句所在的方法將直接返回。使用goto語句可以從一個case跳到另一個case中執行,如下面這段代碼:

            int a = 1;
            switch (a)
            {
                case 1:
                    Console.WriteLine("1");
                    goto case 2;        
                case 2:
                    Console.WriteLine("2");
                    break;                
                case 3:
                    Console.WriteLine("3");
                    break;
                default:
                    Console.WriteLine("4");
                    break;                
                
            }

程序說明:程序執行完 case 1後會直接執行case 2。但是我們不建議這樣做,這會導致很難察覺的邏輯錯誤。

通常情況下switch語句中一個case語句處理完成後,不能自由的進入下一個case語句,但是這個規則有一個例外。如果把多個case語句放在一起,其後面加一個代碼塊,實際上是一次檢查多個條件,如果滿足這些條件中的任何一個,就會執行代碼,例如:

            int a = 2;
            switch (a)
            {
                case 1:                         
                case 2:                              
                case 3:
                    Console.WriteLine("1或者2或者3");
                    break;
                default:
                    Console.WriteLine("4");
                    break;                
                
            }

三、循環語句
循環就是重復執行語句,循環結構可以實現一個程序模塊的重復執行,它對我們簡化程序、更好的組織算法有著重要的意義。
1、do循環
do循環的結構如下:
do
{
語句或語句塊;
}while (表達式);
do循環先執行語句或語句塊,然後再判斷表達式的值,如果表達式的值為true,則繼續執行循環,直到表達式的值為false。註意:do循環剛執行的時候不管表達式的值為true或者是false它都要先執行一次語句或語句塊,然後再來判斷表達式的值。也就是說如果一開始表達式的值為false,它也會執行一次循環。do循環無論布爾表達式的值是true還是false,語句或語句塊至少會執行一次。另外while語句後面必須使用分號(;)。

2、while循環
while循環的結構如下:
while(表達式)
{
語句或語句塊;
}
while循環則是先判斷表達式的值,然後再執行語句或語句塊,直到表達式的值為false。如果循環剛開始表達式的值就為false,那麽語句或語句塊就不會被執行。

3、for循環
for循環的結構如下:
for(<初始化表達式>;<條件表達式>;<叠代表達式>)
{
語句或語句塊;
}
初始化表達式:可以在該位置定義一個變量並為其賦一個起始值,也可以使用for循環前面定義的變量,但是使用for循環前面定義的變量必須在該位置為其重新賦一個起始值。註意:在該位置定義一個變量並為其賦一個起始值,這種用法定義的變量的作用域僅在for循環語句中,也就是說for循環語句後面的代碼就不能使用該變量;但是用for循環前面定義的變量這種用法定義的變量for循環語句後面的代碼就也能使用該變量。
條件表達式:它是循環繼續或者終止的條件。
叠代表達式:執行完語句或語句塊後就執行叠代表達式,然後再執行條件表達式判斷循環是否繼續。
for循環示例:

            //將1到10打印到屏幕上
            for (int a =1 ; a <= 10; a++)
            {
                Console.WriteLine(a);
            }            
            Console.ReadKey();

4、foreach循環
foreach語句用於枚舉一個集合的元素,並對該集合中的每一個元素執行一次嵌入語句。foreach循環的結構如下:
foreach(<類型> <叠代變量名> in <集合>)
{
語句或語句塊;
}
註意:叠代變量的類型必須與集合的類型相同。集合內元素的個數決定循環內程序段重復執行的次數,每次進入循環,會依次將集合元素內容指定給變量,當所有元素都讀完後,就會跳出foreach循環。foreach循環對集合內元素進行只讀訪問,不能改變任何元素的值。foreach循環在循環的過程中不能對集合進行添加元素或者刪除元素的操作。示例:

            List<string> strList = new List<string>();
            for (int a =1 ; a <= 10; a++)
            {
                strList.Add(a.ToString());
            }

            foreach (string str in strList)
            {
                Console.WriteLine(str);
                strList.Remove(str);
            }
            Console.ReadKey();

以上程序中的foreach語句在輸出集合strList中的第一元素並將其移除集合後進行下一次循環的時候會產生異常。

5、無限循環
在代碼編寫錯誤或者故意進行設計時,可以定義永不終止的循環,即所謂的無限循環。示例:
while(true)
{
語句或語句塊;
}
無限循環語句也是有用的,而且可以使用break語句或者手工使用Windows任務管理器退出無限循環。

四、異常處理
C#中的異常處理也算一種流程控制,try…catch…finally語句用於異常的捕獲和處理,具體語法如下:
try
{
語句或語句塊;
}
catch(<execptionType> e)
{
語句或語句塊;
}
finally
{
語句或語句塊;
}
try:包含拋出異常的代碼。
catch:包含拋出異常時要執行的代碼。catch塊可以使用<execptionType>設置為只響應特定的異常類型,以便提供多個catch塊。
finally:包含始終會執行的代碼,如果沒有產生異常,則在try塊之後執行,如果處理了異常,就在catch塊後執行。
try…catch…finally語句的執行順序依次是:
1、try塊在發生異常的地方中斷程序的執行。
2、如果有catch塊,就檢查該塊是否匹配已拋出的異常類型。如果沒有catch塊,就執行finally塊(如果沒有catch塊,就一定要有finally塊)。
3、如果有catch塊,但它與已發生的異常類型不匹配,就檢查是否有其他catch塊。
4、如果有catch塊匹配已發生的異常類型,就執行它包含的代碼,再執行finally塊(如果有)。
5、如果catch塊都不匹配已發生的異常類型,就執行finally塊(如果有)。
從try…catch…finally語句的執行順序可以看出try…catch…finally語句有多種組合模式,這裏就不詳細講解。

C#基礎之流程控制語句詳解