在如下幾種狀況下須要拆分類定義:html
處理大型項目時,使一個類分佈於多個獨立文件中可讓多位程序員同時對該類進行處理。程序員
當使用自動生成的源文件時,你能夠添加代碼而不須要從新建立源文件。 Visual Studio 在建立Windows 窗體、Web 服務包裝器代碼等時會使用這種方法。 你能夠建立使用這些類的代碼,這樣就不須要修改由Visual Studio生成的文件。ide
若要拆分類定義,請使用 partial 關鍵字修飾符,以下所示:函數
public partial class Employee { public void DoWork() { } } public partial class Employee { public void GoToLunch() { } }
partial
關鍵字指示可在命名空間中定義該類、結構或接口的其餘部分。 全部部分都必須使用 partial
關鍵字。 在編譯時,各個部分都必須可用來造成最終的類型。 各個部分必須具備相同的可訪問性,如 public
、private
等。
若是將任意部分聲明爲抽象的,則整個類型都被視爲抽象的。 若是將任意部分聲明爲密封的,則整個類型都被視爲密封的。 若是任意部分聲明基類型,則整個類型都將繼承該類。ui
指定基類的全部部分必須一致,但忽略基類的部分仍繼承該基類型。 各個部分能夠指定不一樣的基接口,最終類型將實現全部分部聲明所列出的所有接口。 在某一分部定義中聲明的任何類、結構或接口成員可供全部其餘部分使用。 最終類型是全部部分在編譯時的組合。this
partial 修飾符不可用於委託或枚舉聲明中。spa
class Container { partial class Nested { void Test() { } } partial class Nested { void Test2() { } } }
編譯時會對分部類型定義的屬性進行合併。 如下面的聲明爲例:code
[SerializableAttribute] partial class Moon { } [ObsoleteAttribute] partial class Moon { }
它們等效於如下聲明:htm
[SerializableAttribute] [ObsoleteAttribute] class Moon { }
將從全部分部類型定義中對如下內容進行合併:blog
XML 註釋
接口
泛型類型參數屬性
class 特性
成員
如下面的聲明爲例:
partial class Earth : Planet, IRotate { } partial class Earth : IRevolve { }
它們等效於如下聲明:
class Earth : Planet, IRotate, IRevolve { }
限制
處理分部類定義時需遵循下面的幾個規則:
要做爲同一類型的各個部分的全部分部類型定義都必須使用 partial
進行修飾。 例如,下面的類聲明會生成錯誤:
public partial class A { } //public class A { } // 錯誤, 也必須使用 partial 修飾
partial
修飾符只能出如今緊靠關鍵字 class
、struct
或 interface
前面的位置。
分部類型定義中容許使用嵌套的分部類型,以下面的示例中所示:
partial class ClassWithNestedClass { partial class NestedClass { } } partial class ClassWithNestedClass { partial class NestedClass { } }
要成爲同一類型的各個部分的全部分部類型定義都必須在同一程序集和同一模塊(.exe 或 .dll 文件)中進行定義。 分部定義不能跨越多個模塊。
類名和泛型類型參數在全部的分部類型定義中都必須匹配。 泛型類型能夠是分部的。 每一個分部聲明都必須以相同的順序使用相同的參數名。
下面用於分部類型定義中的關鍵字是可選的,可是若是某關鍵字出如今一個分部類型定義中,則該關鍵字不能與在同一類型的其餘分部定義中指定的關鍵字衝突:
有關詳細信息,請參閱類型參數的約束。
示例 1
下面的示例在一個分部類定義中聲明 Coords
類的字段和構造函數,在另外一個分部類定義中聲明成員 PrintCoords
。
public partial class Coords { private int x; private int y; public Coords(int x, int y) { this.x = x; this.y = y; } } public partial class Coords { public void PrintCoords() { Console.WriteLine("Coords: {0},{1}", x, y); } } class TestCoords { static void Main() { Coords myCoords = new Coords(10, 15); myCoords.PrintCoords(); Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } // 輸出: Coords: 10,15
示例 2
從下面的示例能夠看出,你也能夠開發分部結構和接口。
partial interface ITest { void Interface_Test(); } partial interface ITest { void Interface_Test2(); } partial struct S1 { void Struct_Test() { } } partial struct S1 { void Struct_Test2() { } }
分部方法在C#3.0中才支持,請參考《 C# 3.0中的新增功能05 分部方法》