C# 2.0 Specification (四)
2024-07-21 02:20:03
供稿:網(wǎng)友
這段比較短就先干掉了:)
23不完整類型
23.1不完整類型聲明
新類型修飾符partial 用于在多個部分中定義一個類型。為了確保和現(xiàn)存程序的兼容性,這個修飾符和其他修飾符(比如get和set)是不同的,它不是一個關(guān)鍵字,并且它必須緊鄰出現(xiàn)在關(guān)鍵字class ,struct或者interface之前。
l class-declaration(類聲明)
attributes opt class-modifiers opt partialopt class identifier type-parameter-list opt
class-base opt type-parameter-constraints-clausesopt class-body ;opt
(特性 可選 類修飾符 可選 partial可選 class 標(biāo)識符
類型參數(shù)列表 可選 :基類 可選 類型參數(shù)約束語句 可選 類體;可選)
l struct-declaration:(結(jié)構(gòu)聲明)
attributesopt struct-modifiersopt partialopt struct identifier type-parameter-listopt
struct-interfacesopt type-parameter-constraints-clausesopt struct-body ;opt
(特性 可選 結(jié)構(gòu)修飾符 可選 partial 可選 struct 標(biāo)識符
類型參數(shù)列表 可選
結(jié)構(gòu)接口 可選 類型參數(shù)約束語句 可選
結(jié)構(gòu)體;可選 )
l interface-declaration:(接口聲明)
attributesopt interface-modifiersopt partialopt interface identifier type-parameter-listopt
interface-baseopt type-parameter-constraints-clausesopt interface-body ;opt
(特性可選 接口修飾符 可選 partial 可選 interface 標(biāo)識符
類型參數(shù)列表 可選
基接口 可選 類型參數(shù)約束語句 可選
接口體 ;可選)
不完整類型聲明的每個部分都必須包含partial修飾符,并且和其他部分必須被聲明在相同的命名空間。partial修飾符表明該類型聲明的附加部分可以存在于其他某個地方,但這種附加部分的存在并不是必需的;在一個單一類型聲明中包含partial修飾符也是合理的。
不完整類型的所有部分必須放在一起編譯,這樣它們就可以在編譯時被融合。特別的是,不完整類型不容許對已經(jīng)被編譯的類型進(jìn)行擴(kuò)展。
嵌套類型(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 {}
類型參數(shù)上的特性也以相同的風(fēng)格組合。
23.1.2修飾符
當(dāng)不完整類型聲明包含訪問說明(public,protected,internal和private)時,它必須與其它部分的訪問說明一致。如果不完整類型的各個部分都不包含訪問說明,該類型將被賦予適當(dāng)?shù)哪J(rèn)可訪問性(§3.5.1)。
如果嵌套類型的一個或多個不完整聲明包含new修飾符,并且如果嵌套類型隱藏了一個繼承成員,將不會有任何警告。(§3.7.12)
如果類的一個或多個不完整聲明包含abstract修飾符,那么這個類就是抽象的(§10.1.1.1),反之就是非抽象的。
注意,一個類不能同時既是抽象的又是密封的(sealed)。
當(dāng)unsafe修飾符被用于一個不完整類型聲明時,只有特定的部分被認(rèn)為是不安全上下[unsafe contex(§18.1))]。
23.1.3類型參數(shù)和約束
如果泛型類型在多個部分被聲明,每個部分都必須說明類型參數(shù)。每個部分都必須有相同數(shù)量的類型參數(shù),并且對于每個類型參數(shù)必須有相同的名字和順序。
當(dāng)不完整泛型聲明包含類型參數(shù)約束(where 語句),該約束必須和其他部分的約束一致。特別的是,包含約束的每個部分必須具有相同集合類型參數(shù)的約束,并且對于每個類型參數(shù),
類、接口和構(gòu)造函數(shù)約束的集合必須是相同的。如果不完整泛型的任何部分都沒有指定約束,類型參數(shù)就被認(rèn)為是不帶約束的。
示例
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>
{
...
}
是正確的,因?yàn)檫@些包含約束的部分有效地指定了類、接口的相同集合,以及相應(yīng)相同集合的類型參數(shù)的構(gòu)造函數(shù)約束。
23.1.4基類
當(dāng)不完整類聲明包含基類說明時,它必須與包含基類說明的所有其他部分一致。如果不完整類聲明的任何部分都不包含基類聲明,那么基類將是system.object(§10.1.2.1)。
23.1.5基接口
在多個部分中聲明的類型的基接口集合,是在各個部分中指定的基接口的聯(lián)合。一個特定的基接口在每個部分中只能被命名一次,但可以在多個部分中命名相同的基接口。但對于任何給出的基接口成員只能有唯一的實(shí)現(xiàn)。
在例子
partial class c: ia, ib {...}
partial class c: ic {...}
partial class c: ia, ib {...}
中類c的基接口是ia,ib和ic。
通常,在接口聲明的部分中提供接口的實(shí)現(xiàn);但這不是必需的。一個部分可以為聲明在另一個部分中的接口提供實(shí)現(xiàn)。
partial class x
{
int icomparable.compareto(object o) {...}
}
partial class x: icomparable
{
...
}
23.1.6成員
聲明在多個部分中的類型的成員只是在各個部分中聲明的成員的聯(lián)合。類型聲明的所有部分的內(nèi)容共享相同的聲明空間(§3.3),并且每個成員(§3.7)的作用域擴(kuò)展到所有部分的內(nèi)容。任何成員的所有可訪問域總是包含封閉類型的所有部分;在一個部分中聲明的private成員可以隨意的在另一個部分訪問。在一個類型的多個部分中聲明相同的成員將造成編譯時錯誤,除非該成員是一個帶有partial修飾符的成員。
partial class a
{
int x; // 錯誤, 不能多次聲明x
partial class inner // ok, inner 是不完整類型
{
int y;
}
}
partial class a
{
int x; // 錯誤,不能多次聲明x
partial class inner // ok, inner是不完整類型
{
int z;
}
}
盡管一個類型中成員的次序?qū)τ赾#代碼并不是太重要,但在面對其他語言和環(huán)境時卻可能是很重要的。在這樣的情況下,在多個部分中聲明的類型內(nèi)成員次序?qū)⑹俏炊x的。
23.2名字綁定
雖然可擴(kuò)展類型的每個部分必須聲明在相同的命名空間,但這些部分也可以寫在不同的命名空間中。為此,對于各個部分可以使用不同的using指令(§9.3)。當(dāng)在一個部分中解釋簡單名字(§7.5.2)時,只有包含該部分的命名空間using 指令被考慮。這將使得在不同部分的相同標(biāo)識符表示不同的意義。
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
}
}
國內(nèi)最大的酷站演示中心!