1. 什么是局部類型?
C# 2.0 引入了局部類型的概念。局部類型同意我們將一個類、結構或接口分成幾個部分,分別實如今幾個不同的.cs文件里。
局部類型適用於下面情況:
(1) 類型特別大,不宜放在一個文件里實現。
(2) 一個類型中的一部分代碼為自己主動化工具生成的代碼,不宜與我們自己編寫的代碼混合在一起。
(3) 須要多人合作編寫一個類。
局部類型是一個純語言層的編譯處理,不影響不論什么運行機制——其實C#編譯器在編譯的時候仍會將各個部分的局部類型合並成一個完整的類。
public partial class Program
{
static void Main(string[] args)
{
}
}
partial class Program
{
public void Test()
{
}
}
2. 局部類型的限制
(1) 局部類型僅僅適用於類、接口、結構,不支持托付和枚舉。
(2) 同一個類型的各個部分必須都有修飾符 partial。
(3) 使用局部類型時,一個類型的各個部分必須位於同樣的命名空間中。
(4) 一個類型的各個部分必須被同一時候編譯。
3. 局部類型的注意點
(1) keywordpartial是一個上下文keyword,僅僅有和 class、struct、interface 放在一起時才有keyword的含義。因此partial的引入不會影響現有代碼中名稱為partial的變量。
(2) 局部類型的各個部分通常是分開放在幾個不同的.cs文件里,但C#編譯器同意我們將他們放在同一文件里。
4. 局部類型的應用特性
在局部類型上的特性具有“累加”效應。
[Attribute1, Attribute2("Hello")]
partial class Class1{}
[Attribute3, Attribute2("Exit")]
partial class Class1{}
相當於
[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 {}
注:Attribute2屬性同意在類上多次使用。
5. 局部類型上的修飾符
(1) 一個類型的各個部分上的訪問修飾符必須維持一致性。
(2) 假設一個類型有一個部分使用了abstract修飾符,那么整個類都將被視為抽象類。
(3) 假設一個類型有一個部分使用了 sealed 修飾符,那么整個類都將被視為密封類。
(4) 一個類的各個部分不能使用相互矛盾的修飾符,比方不能在一個部分上使用abstract,又在還有一個部分上使用sealed。
6. 局部類型的基類和接口
(1) 一個類型的各個部分上指定的基類必須一致。某個部分能夠不指定基類,但假設指定,則必須同樣。
(2) 局部類型上的接口具有“累加”效應。
partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}
相當於
class Class2: Iinterface1, Iinterface2, Iinterface3 {}
把全部的源碼作為一個類型保存在一個單獨的文件中是一個好的編程習慣,但有時候一個類型變得過於龐大以至於這樣做成為一個不切實際的約束。此外,編程人員常常使用源碼生成器來產生一個應用程序的初始結構,然后再改動產生的代碼。不幸的是,當源碼在將來某個時候再次公布時,已存在的改動就要被覆蓋了。
Partial types同意把類,結構和接口打破為多個代碼碎片存在不同的源碼文件,以便於簡化開發和維護。加之partial types同意機器產生的和用戶編寫的類型部分分離,這樣就能夠方便添加工具產生的代碼。
Partial,是一個新的類型修飾符,在把一個類型定義在多個部分的時候使用。以下是一個partial class的演示樣例,以兩個部分實現。這兩個部分可能在兩個不同的源碼文件,比方說第一個部分是由一個數據庫映射工具產生的,而第二個部分是手工編寫的。
public partial class Customer
{
private int id;
private string name;
private string address;
private List<Order> orders;
public Customer() {
}
}
public partial class Customer
{
public void SubmitOrder(Order order) {
orders.Add(order);
}
public bool HasOutstandingOrders() {
return orders.Count > 0;
}
}
當上面的兩個部分在一起編譯,結果產生的代碼就好像這個類是寫在一個單元里一樣。
public class Customer
{
private int id;
private string name;
private string address;
private List<Order> orders;
public Customer() {
}
public void SubmitOrder(Order order) {
orders.Add(order);
}
public bool HasOutstandingOrders() {
return orders.Count > 0;
}
}
一個partial type的全部部分必須在一起編譯,這樣全部的部分才干在編譯的時候整合在一起。特別的是partial types不同意增加已經編譯好的類型。