国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

解析C#中的分部類和分部方法

2020-01-24 01:18:05
字體:
來源:轉載
供稿:網友

可以將類或結構、接口或方法的定義拆分到兩個或多個源文件中。每個源文件包含類型或方法定義的一部分,編譯應用程序時將把所有部分組合起來。
分部類
在以下幾種情況下需要拆分類定義:
處理大型項目時,使一個類分布于多個獨立文件中可以讓多位程序員同時對該類進行處理。
使用自動生成的源時,無需重新創建源文件便可將代碼添加到類中。Visual Studio 在創建 Windows 窗體、Web 服務包裝代碼等時都使用此方法。無需修改 Visual Studio 創建的文件,就可創建使用這些類的代碼。
若要拆分類定義,請使用 partial 關鍵字修飾符,如下所示:

public partial class Employee{  public void DoWork()  {  }}public partial class Employee{  public void GoToLunch()  {  }}

partial 關鍵字指示可在命名空間中定義該類、結構或接口的其他部分。所有部分都必須使用 partial 關鍵字。在編譯時,各個部分都必須可用來形成最終的類型。各個部分必須具有相同的可訪問性,如 public、private 等。
如果將任意部分聲明為抽象的,則整個類型都被視為抽象的。如果將任意部分聲明為密封的,則整個類型都被視為密封的。如果任意部分聲明基類型,則整個類型都將繼承該類。
指定基類的所有部分必須一致,但忽略基類的部分仍繼承該基類型。各個部分可以指定不同的基接口,最終類型將實現所有分部聲明所列出的全部接口。在某一分部定義中聲明的任何類、結構或接口成員可供所有其他部分使用。最終類型是所有部分在編譯時的組合。

注意: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 注釋
  • 接口
  • 泛型類型參數特性
  • 類特性
  • members

例如,請考慮下列聲明:

partial class Earth : Planet, IRotate { }partial class Earth : IRevolve { }

它們等效于以下聲明:

class Earth : Planet, IRotate, IRevolve { }

限制
處理分部類定義時需遵循下面的幾個規則:
要作為同一類型的各個部分的所有分部類型定義都必須使用 partial 進行修飾。例如,下面的類聲明將生成錯誤:

public partial class A { }//public class A { } // Error, must also be marked partial

partial 修飾符只能出現在緊靠關鍵字 class、struct 或 interface 前面的位置。
分部類型定義中允許使用嵌套的分部類型,如下面的示例中所示:

partial class ClassWithNestedClass{  partial class NestedClass { }}partial class ClassWithNestedClass{  partial class NestedClass { }}

要成為同一類型的各個部分的所有分部類型定義都必須在同一程序集和同一模塊(.exe 或 .dll 文件)中進行定義。分部定義不能跨越多個模塊。
類名和泛型類型參數在所有的分部類型定義中都必須匹配。泛型類型可以是分部的。每個分部聲明都必須以相同的順序使用相同的參數名。
下面的用于分部類型定義中的關鍵字是可選的,但是如果某關鍵字出現在一個分部類型定義中,則該關鍵字不能與在同一類型的其他分部定義中指定的關鍵字沖突:

  • public
  • private
  • protected
  • internal
  • abstract
  • sealed
  • 基類
  • new 修飾符(嵌套部分)
  • 泛型約束

示例 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();    // Keep the console window open in debug mode.    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() { }}

分部方法
分部類或結構可以包含分部方法。類的一個部分包含方法的簽名。可以在同一部分或另一個部分中定義可選實現。如果未提供該實現,則會在編譯時移除方法以及對方法的所有調用。
分部方法使類的某個部分的實施者能夠定義方法(類似于事件)。類的另一部分的實施者可以決定是否實現該方法。如果未實現該方法,編譯器將移除方法簽名以及對該方法的所有調用。調用該方法,包括調用中的任何計算結果,在運行時沒有任何影響。因此,分部類中的任何代碼都可以隨意地使用分部方法,即使未提供實現也是如此。如果調用了未實現的方法,將不會導致編譯時錯誤或運行時錯誤。
在自定義生成的代碼時,分部方法特別有用。這些方法允許保留方法名稱和簽名,因此生成的代碼可以調用方法,而開發人員可以決定是否實現方法。與分部類非常類似,分部方法使代碼生成器創建的代碼和開發人員創建的代碼能夠協同工作,而不會產生運行時開銷。
分部方法聲明由兩個部分組成:定義和實現。它們可以位于分部類的不同部分中,也可以位于同一部分中。如果不存在實現聲明,則編譯器將優化定義聲明和對方法的所有調用。

// Definition in file1.cspartial void onNameChanged();// Implementation in file2.cspartial void onNameChanged(){ // method body}
  • 分部方法聲明必須以上下文關鍵字 partial 開頭,并且方法必須返回 void。
  • 分部方法可以有 ref 參數,但不能有 out 參數。
  • 分部方法為隱式 private 方法,因此不能為 virtual 方法。
  • 分部方法不能為 extern 方法,因為主體的存在確定了方法是在定義還是在實現。
  • 分部方法可以有 static 和 unsafe 修飾符。
  • 分部方法可以為泛型的。約束將放在定義分部方法聲明上,但也可以選擇重復放在實現聲明上。參數和類型參數名稱在實現聲明和定義聲明中不必相同。

可以為已定義并實現的分部方法生成委托,但不能為已經定義但未實現的分部方法生成委托。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禄劝| 方城县| 黑山县| 黑龙江省| 四平市| 汾西县| 嘉黎县| 枣庄市| 东辽县| 晋城| 潜江市| 岳池县| 琼中| 北辰区| 武清区| 津市市| 乌审旗| 嘉义县| 蕉岭县| 鄂托克前旗| 潍坊市| 那曲县| 徐州市| 许昌县| 同仁县| 辽阳市| 仙居县| 江油市| 加查县| 阿克苏市| 阜城县| 涞源县| 汾西县| 武胜县| 厦门市| 新竹县| 天津市| 五河县| 晋中市| 新竹县| 南溪县|