1. 程式人生 > >8.C#基礎之語句(在整理當中)

8.C#基礎之語句(在整理當中)

  8.1結束點和可到達性

     在介紹各個語句之前先說一下結束點和可到達性的概念,因為每個語句都有一個結束點,就是緊跟在語句後面的那個位置,到達結束點時,控制就轉移到該塊中的下一個語句;執行流程可能到達的語句稱為該語句是可到達的,反之是不可到達的。比如:

     第二個Console.WriteLine語句就不能只能,goto語句直接跳過去了,所以該語句就是不可能到達的,其他的語句是可到達的。

     為了確定某個特定的語句或結束點是否可到達,編譯器根據為各語句定義的可到達性規則進行控制流分析,但控制流分析只考慮控制語句是常數表示式的值,至於非常數表示式被認為具有該型別的任何可能指。比如:

     其中if的判斷語句是常數表示式,因為i被設定為常數,所以Console.WriteLine被認為是不可到達的;若去了const,把i設定為區域性變數int i=1,那麼判斷語句就是非常數表示式,Console.WriteLine就被認為是可到達的,即使它實際上永遠不會被執行,雖然i已經被賦值是1,但流程分析會給出當i=2的情況(雖然我們不會做)。

     函式成員的塊被認為是始終可以到達的。

  8.2塊

     塊用於在只能使用單個語句的上下文中編寫多個語句。

     塊中可以沒有語句列表,沒有時稱塊是空的;塊也可以包含宣告語句,宣告的區域性變數或常數的範圍就是塊本身。

     如果塊本身是可到達的,則塊的語句列表也是可到達的;若果塊是空的或語句列表的結束點是可到達的,那麼塊的結束點也是可到達的。

     語句列表由一個或多個按順序編寫的語句組成的,可以出現在塊和switch塊中。

  8.3空語句

     空語句什麼都不用做,在要求有語句的上下文中不執行任何操作時使用空語句,執行空語句就是將控制轉移到該語句的結束點。

  8.4標記語言

     標記語言可以給語句加上一個標籤作為字首。標記語句可以出現在塊中,但不允許作為嵌入語句。

     標記語句聲明瞭一個標籤,標籤由識別符號命名,標籤的範圍是在其中聲明瞭該標籤的整個塊,包括任何巢狀塊;標籤有自己的宣告空間,不影響其他識別符號。

  8.5宣告語句

     宣告語句宣告區域性變數和區域性常數;宣告語句可以出現在塊中,但不允許它們作為嵌入語句使用。

   8.5.1 區域性變數宣告

     區域性變數宣告的型別由引入的變數型別決定,在使用區域性變數的每個地方必須先賦值,後使用。

   8.5.2 區域性常數宣告

     區域性常數宣告的型別由引入的常數型別決定。

  8.6表示式語句

     表示式語句顧名思義就是用於計算所給定的表示式。

     執行表示式語句就是對它所包含的表示式進行計算,然後將控制轉移到該表示式語句的結束點。

  8.7選擇語句

   8.7.1 if語句

     else部分與語法允許的、詞法上最相近的上一個if語句相關聯。比如if() if() else;    相當於 if(){if() else};

     if執行規則:首先計算布林表示式;

                 如果結果是true,則控制轉移到第一個嵌入語句,當控制到達語句的結束點時,控制轉移到if語句的結束點;

                 如果結果時false,且存在else,則控制轉移到第二個嵌入語句;若果不存在else,則直接轉移到if語句的結束點。

   8.7.2 switch語句

     switch語句是在語句列表中選擇一個符合要求的語句進行執行。

     switch語句的主導型別由switch表示式建立,否則必須有且只有一個使用者定義的從switch表示式的型別到下列某個可能的主導型別的隱式轉化:sbyte、byte、short、ushort、int、uint、long、ulong、char、string或列舉型別;如果不存在這樣的隱式轉化,或存在多個這樣的隱式轉化,則會發生編譯時錯誤。

     每個case標籤的常數表示式的值必須屬於這種型別:它可以隱式轉化為switch語句的主導型別。如果在一個switch語句中有兩個或多個case標籤指定同一個值,則會導致編譯時錯誤。

     一個switch語句有且只有一個default標籤。

     switch語句的執行規則:先計算switch表示式並將其轉換為主導型別;

                           如果在該switch語句的case標籤中,有一個指定的常數恰好等於switch表示式的值,控制將轉移到該case標籤後的語句列表;

                           若果沒一個指定的常數與其匹配,且存在一個default標籤,則將控制轉移到default標籤後的語句列表;如果沒有default,則將控制轉移到switch語句的結束點。

     switch節的語句列表通常以break語句、goto case語句或goto default語句結束。

     switch語句的主導型別可以是string型別,與字串相等運算子一樣,switch語句區分大小寫;當主導型別是string時,允許null作為case標籤常數。

  8.8迭代語句

     迭代語句就是重複執行嵌入語句。

   8.8.1while語句

     while語句:按不同條件執行一個嵌入語句零次或多次。

     while語句的執行規則:先計算布林表示式;

                          如果是true,控制轉移到嵌入語句,執行到嵌入語句的結束點,將控制轉移到while語句的開頭;

                          如果是false,控制將轉移到while語句的結束點。

     在while語句的嵌入語句內,break語句可以將控制轉移到while語句的結束點;而continue語句是將控制轉移到嵌入語句的結束點。

   8.8.2do語句

     do語句:按不同條件執行一個嵌入語句一次或多次。

     do語句的執行規則:首先將控制轉移到嵌入語句;

                       當控制到達嵌入語句的結束頂啊,計算布林表示式,若是true,將控制轉移到do語句開頭;否則轉移到do語句的結束點。

     在do語句的嵌入語句內,break語句可以將控制轉移到do語句的結束點;而do語句是將控制轉移到嵌入語句的結束點。

   8.8.3for語句

     for語句計算一個初始化表示式序列,然後當某個條件為真時,重複執行相關的巢狀語句並計算一個迭代表達式序列。

     for語句的執行規則:如果存在for初始值設定項,則按變數初始值設定項或語句表示式的編寫順序執行,此步驟只執行一次;

                        如果存在for條件,則計算它;

                        如果不存在for條件或計算產生true,控制將轉移到嵌入語句,結束時,按順序計算for迭代程式的表示式,重複上述步驟;

                        如果存在for,且計算產生false,控制將轉移到for語句的結束點。

   8.8.4 foreach語句

     foreach語句用於列舉一個集合的元素,並對該集合中的每個元素執行一次相關的嵌入語句。

     foreach語句的型別和識別符號宣告該語句的迭代變數,迭代變數相當於一個其範圍覆蓋整個嵌入語句的只讀區域性變數。在foreach語句執行期間,迭代變量表示當前正在為其執行迭代的集合元素。如果嵌入語句試圖修改迭代變數或將迭代變數作為ref或out引數傳遞,將會發生編譯時錯誤。

     foreach語句的表示式的型別必須是集合型別,且必須有一個從該集合的元素型別到迭代變數的型別的顯式轉換。如果該表示式具有null值,則將引發System.NullReferenceException。

     型別集合:如果型別C實現了System.Collections.IEnumerable介面,或滿足下列條件,就稱它是集合型別:

                   C包含一個public例項方法,它帶有簽名GetEnumerator(),且返回值屬於結構型別、類型別或介面型別(下面用E表示該返回值的型別)

                   E包含一個public例項方法,此方法具有簽名MoveNext()和返回型別bool;

                   E包含一個 名為Current的public例項屬性,此屬性允許讀取當前值。此屬性的型別稱為該集合型別的元素型別。

 注:一個實現IEnumerable的型別也是集合型別,即使不滿足上述條件(這是可能的,如果該型別通過"顯式介面成員實現"的方式實現某些IEnumerable成員)

     System.Array型別是集合型別,而由於所有陣列型別都是它的派生類,所以foreach語句中允許使用任何陣列型別表示式。

  8.9跳轉語句

     發