這段比較短就先幹掉了:)
23不完整類型
23.1不完整型別宣告
新類型修飾符partial 用於在多個部分中定義一個類型。為了確保和現存程式的相容性,這個修飾符和其他修飾符(比如get和set)是不同的,它不是一個關鍵字,並且它必須緊鄰出現在關鍵字class ,struct或者interface之前。
l class-declaration(類聲明)attributes opt class-modifiers opt partialopt class identifier type-parameter-list optclass-base opt type-parameter-constraints-clausesopt class-body ;opt(特性 可選 類修飾符 可選 partial可選 class 標識符型別參數列表 可選 :基類 可選 型別參數約束語句 可選 類體;可選)l struct-declaration:(結構聲明)attributesopt struct-modifiersopt partialopt struct identifier type-parameter-listoptstruct-interfacesopt type-parameter-constraints-clausesopt struct-body ;opt(特性 可選 結構修飾符 可選 partial 可選 struct 標識符型別參數列表 可選結構介面 可選 型別參數約束語句 可選結構體;可選 )l interface-declaration:(介面聲明)attributesopt interface-modifiersopt partialopt interface identifier type-parameter-listoptinterface-baseopt type-parameter-constraints-clausesopt interface-body ;opt(特性可選 介面修飾符 可選 partial 可選 interface 標識符型別參數列表 可選基底介面 可選 型別參數約束語句 可選介面體 ;可選)
不完整型別宣告的每個部分都必須包含partial修飾符,並且和其他部分必須被聲明在相同的命名空間。partial修飾符表明該型別宣告的附加部分可以存在於其他某個地方,但這種附加部分的存在並不是必需的;在一個單一型別宣告中包含partial修飾符也是合理的。
不完整類型的所有部分必須放在一起編譯,這樣它們就可以在編譯時間被融合。特別的是,不完整類型不容許對已經被編譯的類型進行擴充。
巢狀型別(nested type)可以通過使用partial修飾符而聲明在多個地方。典型的情況是,包含類型(也就是包含巢狀型別的類型)同樣使用partial聲明,而巢狀型別的各個部分也在包含類型的不同部分中聲明。
partial修飾符不能用在委託或枚舉聲明中。
23.1特性
不完整類型的特性通過以不定的(unspecified)順序組合各個部分的特性而確定。如果一個特性被放在不完整類型的多個部分,它等價於在該類型上多次指定該特性。例如,這兩個部分
[Attr1, Attr2("hello")]partial class A {}[Attr3, Attr2("goodbye")]partial class A {}等價於如下聲明。[Attr1, Attr2("hello"), Attr3, Attr2("goodbye")]class A {}
型別參數上的特性也以相同的風格組合。
23.1.2修飾符
當不完整型別宣告包含訪問說明(public,protected,internal和private)時,它必須與其它部分的訪問說明一致。如果不完整類型的各個部分都不包含訪問說明,該類型將被賦予適當的預設可訪問性(§3.5.1)。
如果巢狀型別的一個或多個不完整聲明包含new修飾符,並且如果巢狀型別隱藏了一個繼承成員,將不會有任何警告。(§3.7.12)
如果類的一個或多個不完整聲明包含abstract修飾符,那麼這個類就是抽象的(§10.1.1.1),反之就是非抽象的。
注意,一個類不能同時既是抽象的又是密封的(sealed)。
當unsafe修飾符被用於一個不完整型別宣告時,只有特定的部分被認為是不安全上下[unsafe contex(§18.1))]。
23.1.3型別參數和約束
如果泛型型別在多個部分被聲明,每個部分都必須說明型別參數。每個部分都必須有相同數量的型別參數,並且對於每個型別參數必須有相同的名字和順序。
當不完整泛型聲明包含型別參數約束(where 語句),該約束必須和其他部分的約束一致。特別的是,包含約束的每個部分必須具有相同集合型別參數的約束,並且對於每個型別參數,
類、介面和建構函式約束的集合必須是相同的。如果不完整泛型的任何部分都沒有指定約束,型別參數就被認為是不帶約束的。
樣本
partial class Dictionary<K,V>where K: IComparable<K>where V: IKeyProvider<K>, IPersistable{...}partial class Dictionary<K,V>where V: IPersistable, IKeyProvider<K>where K: IComparable<K>{...}partial class Dictionary<K,V>{...}
是正確的,因為這些包含約束的部分有效地指定了類、介面的相同集合,以及相應相同集合的型別參數的建構函式約束。
23.1.4基類
當不完整類聲明包含基類說明時,它必須與包含基類說明的所有其他部分一致。如果不完整類聲明的任何部分都不包含基類聲明,那麼基類將是System.Object(§10.1.2.1)。
23.1.5基底介面
在多個部分中聲明的類型的基底介面集合,是在各個部分中指定的基底介面的聯合。一個特定的基底介面在每個部分中只能被命名一次,但可以在多個部分中命名相同的基底介面。但對於任何給出的基底介面成員只能有唯一的實現。
在例子
partial class C: IA, IB {...}partial class C: IC {...}partial class C: IA, IB {...}中類C的基底介面是IA,IB和IC。
通常,在介面聲明的部分中提供介面的實現;但這不是必需的。一個部分可以為聲明在另一個部分中的介面提供實現。
partial class X{int IComparable.CompareTo(object o) {...}}partial class X: IComparable{...}
23.1.6成員
聲明在多個部分中的類型的成員只是在各個部分中聲明的成員的聯合。型別宣告的所有部分的內容共用相同的聲明空間(§3.3),並且每個成員(§3.7)的範圍擴充到所有部分的內容。任何成員的所有可訪問域總是包含封閉類型的所有部分;在一個部分中聲明的private成員可以隨意的在另一個部分訪問。在一個類型的多個部分中聲明相同的成員將造成編譯時間錯誤,除非該成員是一個帶有partial修飾符的成員。
partial class A{int x; // 錯誤, 不能多次聲明xpartial class Inner // Ok, Inner 是不完整類型{int y;}}partial class A{int x; // 錯誤,不能多次聲明xpartial class Inner // Ok, Inner是不完整類型{int z;}}
儘管一個類型中成員的次序對於C#代碼並不是太重要,但在面對其他語言和環境時卻可能是很重要的。在這樣的情況下,在多個部分中聲明的類型內成員次序將是未定義的。
23.2名字綁定
雖然可擴充類型的每個部分必須聲明在相同的命名空間,但這些部分也可以寫在不同的命名空間中。為此,對於各個部分可以使用不同的using指令(§9.3)。當在一個部分中解釋簡單名字(§7.5.2)時,只有包含該部分的命名空間using 指令被考慮。這將使得在不同部分的相同標識符表示不同的意義。
namespace N{using List = System.Collections.ArrayList;partial class A{List x; // x具有類型 System.Collections.ArrayList}}namespace N{using List = Widgets.LinkedList;partial class A{List y; // y 具有類型 Widgets.LinkedList}}
以上就是C# 2.0 Specification (四)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!