天天看點

7.C#基礎之表達式(完成)

     表達式是運算符和操作數的序列。一個表達式可歸類為:值、變量、命名空間、類型、方法組、屬性通路、事件通路、索引器通路、Nothing,但表達式的最終結果絕不會是一個命名空間、類型、方法組或事件通路,這種表達式是隻能在特定上下文中使用的中間構造。

  7.1運算符

     表達式的運算符訓示對操作數進行什麼樣的運算。運算符有三類:一進制運算符、二進制運算符、三元運算符(隻有一個,是"?")。

     表達式中運算符的計算順序由運算符的優先級和順序關聯性确定;操作數的順序是從左到右,比如f(i)+g(i++)*h(i),先用i的值調用f方法,然後用新值調用g方法,最後用新值調用h方法,這就與運算符的優先級無關。

   7.1.1 運算符的優先級和順序關聯性

     在第一章已經發過一張圖,在這就再發一次。

7.C#基礎之表達式(完成)

     當操作數出現具有相同優先級的兩個運算符之間時,運算符的順序關聯性控制運算的執行順序:

          除了指派運算符外,所有的二進制運算符都向左順序關聯,即從左向右執行;

          指派運算符和條件運算符(?:)向右順序關聯,即從右向左執行運算,比如x=y=z,先計算y=z。

   7.1.2 運算符重載

     所有一進制和二進制運算符都具有可自動用于任何表達式的預定義實作,除了這個,還可以通過在類或結構中設定operator聲明引入使用者定義的實作,切使用者定義的運算符實作的優先級總是高于預定義運算符實作的優先級,僅當沒有适用的使用者定義運算符實作時才考慮預定義運算實作符。

        可重載的一進制運算符有:+、-、!、~、++、--、true、false

        可重載的二進制運算符有:+、-、*、/、%、|、^、《、》、==、!=、<、>、<=、>=

     隻有上面的可以重載,當重載一個二進制運算符後,也會隐式重載相應的指派運算符,比如重載了*,也會重載*=。

     使用者定義的運算符聲明總是要求至少一個參數為包含運算符聲明的類類型或結構類型,切使用者定義的運算符聲明不能修改運算符的文法、優先級或順序關聯性。

  7.2成員查找

     成員查找是确定類型上下文的名稱含義的過程;比如查找在T類型中的名稱N的成員:

         首先構造一個在T和T基類型中聲明名為N的所有可通路成員的集合,不包含override修飾符在内的聲明;

         其次從該集合移除被其他成員隐藏的成員;

         最後如果結果集合是由一個非方法成員組成,則此成員就是結果;如果集合隻包含方法,則此方法就是結果;否則查找失敗。

  7.3函數成員

     函數成員是包含可執行語句的成員,且函數成員總是類型的成員,不能是命名空間的成員。C#定義了類别的函數成員有:方法、屬性、事件、索引器、使用者定義運算符、執行個體構造函數、靜态構造函數、析構函數。

     除了析構函數和靜态構造函數(它們不能被顯式調用),其他成員中包含的語句是通過函數成員調用執行的。

   7.3.1 參數清單

     每個函數成員調用均包括一個參數清單,如何指定函數成員調用的參數清單的語言取決于函數成員的類型:

          對于執行個體構造函數、方法、委托,參數被指定為參數清單;

          對于屬性,調用get通路器時,參數清單是空的;帶用set通路器時,由指定為指派運算符的左操作數的表達式組成;

          對于事件,參數清單由指定為+=或-=運算符的左操作數的表達式組成;

          對于索引器,參數清單由在索引器通路中的方括号之間指定的表達式組成;

          對于使用者定義的運算符,由一進制運算符的單個操作數或二進制運算符的兩個操作數組成

     對于屬性、事件、索引器、使用者定義的運算符來說,它們的參數總是作為值參數來傳遞,因為它們類型不支援引用參數和輸出參數;而執行個體構造函數、方法、委托的參數清單是:

7.C#基礎之表達式(完成)

   7.3.2重載決策

     重載決策是一種編譯時機制,用于在給定了參數清單和一組候選函數成員的情況下,選擇一個最佳函數成員來實施調用;在C#内,重載決策在下列不同的上下文中選擇一個應調用的函數成員:

          要調用的方法名稱出現在調用表達式中; 

          要調用的執行個體構造函數出現在對象建立表達式中; 

          對索引器通路器的調用出現在元素通路中;

          要調用的預定義運算符或使用者定義的運算符出現在表達式中。

     一旦确定了候選函數成員和參數清單,若果給定了适用的候選函數成員集,則在其中選出最佳函數成員。若果該集合隻包含一個函數成員,則這個函數成員就是最佳函數成員;否則依據成員對給定的參數清單的比對程度選擇。

  7.4基本表達式

     基本表達式包括最簡單的表達式形式:

7.C#基礎之表達式(完成)

   7.4.1 文本

     由文本組成的基本表達式屬于值類别。

   7.4.2 簡單名稱

7.C#基礎之表達式(完成)

     簡單名稱由單個辨別符組成。

   7.4.3 帶括号的表達式

7.C#基礎之表達式(完成)

   7.4.4 成員通路

7.C#基礎之表達式(完成)

   7.4.5 調用表達式

7.C#基礎之表達式(完成)

     調用表達式的基本表達式必須是方法組或委托類型的值。

   7.4.6 元素通路

7.C#基礎之表達式(完成)

     如果元素通路的非數組建立基本表達式是數組類型的值,則該元素通路是一個數組通路;否則該非數組建立基本表達式必須是具有一個或多個索引器成員的類、結構或接口類型的變量或值,在這種情況,元素通路為索引器通路。

   7.4.7 this通路

     this通路由保留字this組成。

7.C#基礎之表達式(完成)

     this通路隻能在執行個體構造函數、執行個體方法或執行個體通路器的"塊"中使用。

   7.4.8 base通路

     base通路由保留字base,後跟一個"."和一個辨別符,或一個用方括号括起來的表達式組成:

7.C#基礎之表達式(完成)

     base通路用于通路被目前類或結構成員隐藏的基類成員。同樣,base通路隻能在執行個體構造函數、執行個體方法或執行個體通路器的塊中使用。

   7.4.9 字尾增量和字尾減量運算符

7.C#基礎之表達式(完成)

     它們的操作數必須是屬于變量、屬性通路或索引器通路類别的表達式;若果它們的操作數是屬性或索引器通路,則該屬性或索引器通路必須同時具有get和set通路器,否則會發生編譯時錯誤。

     注:x++和x--的結果是運算之前x的值,而++x和--x的結果是運算之後x的值;不管哪種情況,運算後x本身都具有相同的值。

   7.4.10 new運算符

     new運算符用于建立類型的新執行個體,有三種形式的new表達式:1.對象建立表達式:用于建立類類型和值類型的新執行個體;

                                                            2.數組建立表達式:用于建立數組類型的新執行個體; 

                                                            3.委托建立表達式:用于建立委托類型的新執行個體。

     new運算符表示建立類型的一個執行個體,但并不表示要為它動态配置設定記憶體。

   7.4.11 typeof運算符

     typeof運算符用于擷取類型的System.Type對象,比如typeof(int)   顯示輸出System.Int32

7.C#基礎之表達式(完成)

   7.4.12 check和unchecked運算符

     check和unchecked運算符用于控制上下文中是否實施關于整型算術運算和轉換的溢出檢查。

7.C#基礎之表達式(完成)

     對于不用任何check和unchecked運算符或語句括起來的非常數表達式,除非外部因素要求check計算,否則溢出檢出預設是unchecked;對于常數表達式,預設的是checked。

  7.5一進制運算符

7.C#基礎之表達式(完成)

  7.6算術運算符

7.C#基礎之表達式(完成)

  7.7移位運算符

7.C#基礎之表達式(完成)

     當聲明重載位移運算符時,第一個操作數的類型必須總是包含運算符聲明的類或結構,第二個操作數的類型必須是int。

  7.8關系和類型測試運算符

7.C#基礎之表達式(完成)

     所有預定義的比較運算符都傳回bool類型的結果:

7.C#基礎之表達式(完成)

  7.9邏輯運算符

7.C#基礎之表達式(完成)

     在預定義的布爾邏輯運算符中,如果x和y均為true,則x&y為true,否則為false;如果x或y為true,x|y為true,否則為false;如果x為true,y為false,或x為false,y為true,則x^y的結果為true。

  7.10條件邏輯運算符

7.C#基礎之表達式(完成)

      &&和||運算符是&和|運算符的條件版本,x&&y:當且僅當x為true時才計算y;x||y:當且僅當x為false才計算y。

  7.11條件運算符

7.C#基礎之表達式(完成)

     b?x:y    首先計算b,如果b為true,計算x;如果b為false,計算y。條件運算符是向右關聯,表示運算從右到左分組,例如a?b:c?d:e形式的表達式按a?b:(c?d:e)計算。

  7.12指派運算符     

7.C#基礎之表達式(完成)

     指派運算符是向右關聯;除=外的指派運算符稱為複合指派運算符;以事件通路表達式作為左操作數的+=和-=運算符稱為事件指派運算符,且事件指派表達式不産生值。

  7.13表達式

7.C#基礎之表達式(完成)

  7.14常數表達式

     常數表達式是編譯時可以完全計算出結果的表達式。

7.C#基礎之表達式(完成)

  7.15布爾表達式

7.C#基礎之表達式(完成)

轉載于:https://www.cnblogs.com/dreamoffire/p/10084181.html

c#