C#2.0新增功能01 分部類與分部方法

  • 2019 年 10 月 4 日
  • 筆記

分部類型

  拆分一個、一個結構、一個介面或一個方法的定義到兩個或更多的文件中, 每個源文件包含類型或方法定義的一部分,編譯應用程式時將把所有部分組合起來。

分部類

在以下幾種情況下需要拆分類定義:

  • 處理大型項目時,使一個類分布於多個獨立文件中可以讓多位程式設計師同時對該類進行處理。
  • 當使用自動生成的源文件時,你可以添加程式碼而不需要重新創建源文件。 Visual Studio 在創建Windows 窗體、Web 服務包裝器程式碼等時會使用這種方法。 你可以創建使用這些類的程式碼,這樣就不需要修改由Visual Studio生成的文件。
  • 若要拆分類定義,請使用 partial 關鍵字修飾符,如下所示:
public partial class Employee  {      public void DoWork()      {      }  }    public partial class Employee  {      public void GoToLunch()      {      }  }

partial 關鍵字指示可在命名空間中定義該類、結構或介面的其他部分。 所有部分都必須使用 partial 關鍵字。 在編譯時,各個部分都必須可用來形成最終的類型。 各個部分必須具有相同的可訪問性,如 publicprivate 等。

如果將任意部分聲明為抽象的,則整個類型都被視為抽象的。 如果將任意部分聲明為密封的,則整個類型都被視為密封的。 如果任意部分聲明基類型,則整個類型都將繼承該類。

指定基類的所有部分必須一致,但忽略基類的部分仍繼承該基類型。 各個部分可以指定不同的基介面,最終類型將實現所有分部聲明所列出的全部介面。 在某一分部定義中聲明的任何類、結構或介面成員可供所有其他部分使用。 最終類型是所有部分在編譯時的組合。

partial 修飾符不可用於委託或枚舉聲明中。

下面的示例演示嵌套類型可以是分部的,即使它們所嵌套於的類型本身並不是分部的也如此。

class Container  {      partial class Nested      {          void Test() { }      }      partial class Nested      {          void Test2() { }      }  }

編譯時會對分部類型定義的屬性進行合併。 以下面的聲明為例:

[SerializableAttribute]  partial class Moon { }    [ObsoleteAttribute]  partial class Moon { }

它們等效於以下聲明:

[SerializableAttribute]  [ObsoleteAttribute]  class Moon { }

將從所有分部類型定義中對以下內容進行合併:

  • 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 修飾符只能出現在緊靠關鍵字 classstructinterface 前面的位置。
  • 分部類型定義中允許使用嵌套的分部類型,如下面的示例中所示:
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() { }  }