1. 程式人生 > >5.C#2.0之不完整型別(完成)

5.C#2.0之不完整型別(完成)

  5.1不完整型別宣告

     新型別修飾符partial,用於在多個部分定義同一個型別。為了確保與現存程式的相容性,這個修飾符和其他修飾符不同,它不是一個關鍵字,且它必須緊鄰在關鍵字class、struct、interface之前。

     不完整型別宣告的每一部分都必須包含partial修飾符,且其他部分必須在同一個名稱空間中宣告。partial修飾符表明該型別宣告的附加部分可以存在於其他某個地方,但這種附加部分不是必須的;也可以在單一型別宣告中出現。

     不完整型別的所有部分必須放在一起編譯,才能在編譯時被融合;它不允許對已經被編譯的型別進行擴充套件。

     巢狀型別可以通過使用partial修飾符而在多個地方宣告。通常情況下,巢狀型別包含的型別,也可以使用partial宣告。

     但partial修飾符不能用在委託/列舉宣告中。

   5.1.1 特性

     不完整型別的特性通過以不定的順序組合各個部分的特性而確定。如果一個特性被放在不完整型別的多個部分,那麼等價於在這型別上多次指定該特性;型別引數上的特性也是這樣的風格組合。

   5.1.2 修飾符

     當不完整型別宣告包含訪問修飾符時(public、protected、internal、private),它必須和其他部分的訪問性一致;如果不完整型別的各個部分都不包含,該型別將賦予適當的預設可訪問性。

     如果巢狀型別的一個/多個不完整部分宣告包含new修飾符,且巢狀型別因此了一個繼承成員,將不會有任何警告;如果類的一個/多個不完整宣告包含abstract修飾符,那麼這個類就是抽象的;如果類的一個/多個不完整宣告包含sealed修飾符,那麼這個類就是封閉的;當unsafe修飾符用於一個不完整型別宣告時,只有特定的部分被認為時不安全上下文。

   5.1.3 型別引數和約束

     如果泛型型別在多個部分被宣告,那麼每個部分都必須說明型別引數,每個部分都必須有相同數量的型別引數,並且對於每個型別引數必須有相同的名字和順序;

     當不完整泛型宣告包含型別引數約束時,該約束必須和其他部分包含的約束一致。詳細的說就是:包含約束的每個部分必須具有相同集合型別引數的約束,並且對於每個型別引數,類、介面、建構函式約束的集合必須是相同大的;如果不完整泛型的任何部分都沒有指定約束,就認為型別引數是不帶約束的。

   5.1.4 基類

     當不完整型別宣告包含基類時, 其他部分都必須包含;如果不完整型別都不包含基類時,那麼基類就會是System.Object。

    5.1.5 基介面

     在多個部分中宣告的型別的基介面集合,是各個部分中指定的基介面的集合。一個特定的基介面在每個部分只能命名一次,可以在多個部分命名同一個基介面,但對於任何給出的基介面成員只能有唯一的實現。

     類C的基介面就是IA,IB和IC。

     通常在介面宣告的每一部分提供介面的實現,但這不是必須的,可以在一個部分宣告,在另一個部分實現介面。

   5.1.6 成員

     宣告在多個部分中的型別的成員只是在各個部分中宣告的成員的聯合。型別宣告的所有部分的內容共享的宣告空間,並且每個成員的作用域擴充套件到所有部分的內容。任何成員的所有可訪問域總是包含封閉型別的所有部分;在一個部分中宣告的private成員可以隨意地在另一個部分訪問。在一個型別的多個部分中宣告相同的成員將導致編譯時錯誤,除非該成員宣告中帶有partial。

     儘管在一個型別中成員的次序對於C#程式碼並不是太重要,但在面對其他語言和環境時卻可能很重要。在這種情況下,在多個部分中宣告的型別內成員次序將是未定義的。

  5.2名稱繫結

     雖然可擴充套件型別的每一部分必須在相同的名稱空間宣告,但還是有辦法寫在不同名稱空間下,那就是對各個部分使用不同的using指令。當在一個部分中解釋簡單名稱時,只有包含該部分的名稱空間using指令被考慮。這將導致在不同部分的相同識別符號表示不同的意義。