c# partial 分部類和分部方法
一、partial
它是一個關鍵字修飾符。可以將類或結構、接口或方法的定義拆分到兩個或更多個源文件中。 每個源文件包含類型或方法定義的一部分,編譯應用程序時將把所有部分組合起來。修飾符不可用於委托或枚舉聲明中。
二、分部類
在以下幾種情況下需要拆分類定義:
-
處理大型項目時,使一個類分布於多個獨立文件中可以讓多位程序員同時對該類進行處理。
-
使用自動生成的源時,無需重新創建源文件便可將代碼添加到類中。 Visual Studio 在創建 Windows 窗體、Web 服務包裝器代碼等時都使用此方法。 無需修改 Visual Studio 創建的文件,就可創建使用這些類的代碼。
簡單示例
public partial class Test { public int Id { get; set; } public string Name { get; set; } public void ShowAge() { Console.WriteLine($" My age is {this.Age}"); } } public partial class Test { publicstring Age { get; set; } public void ShowNewAge() { ChangeAge(); Console.WriteLine($" My new age is {this.Age}"); } private void ChangeAge() { this.Age = "20"; } } class Program {static void Main(string[] args) { var test = new Test() { Id = 1, Name = "1", Age = "11" }; test.ShowAge(); test.ShowNewAge(); var info = $" name:{test.Name},age:{test.Age}"; Console.WriteLine(info); } }
編譯時會對分部類型定義的屬性進行合並;將從所有分部類型定義中對以下內容進行合並:XML 註釋、接口、泛型類型參數屬性、class 特性、成員
public class TestBase { } public interface ITest { void ShowAge(); } [SerializableAttribute] public partial class Test: TestBase { public int Id { get; set; } public string Name { get; set; } public void ShowAge() { Console.WriteLine($" My age is {this.Age}"); } } [ObsoleteAttribute] public partial class Test: ITest { public string Age { get; set; } public void ShowNewAge() { ChangeAge(); Console.WriteLine($" My new age is {this.Age}"); } private void ChangeAge() { this.Age = "20"; } }
它們等效於:
[SerializableAttribute] [ObsoleteAttribute] public class Test : TestBase,ITest { //... }
如果將任意部分聲明為抽象的,則整個類型都被視為抽象的。 如果將任意部分聲明為密封的,則整個類型都被視為密封的。
//抽象類示例 public partial class PTest {} public abstract partial class PTest { } class Program { static void Main(string[] args) { //PTest PTest = new PTest();//提示:無法創建抽象類或接口"PTest"的實例 } } //密封類示例 public partial class STest { } public sealed partial class STest { } //public class SubTest: STest { }
三、分部方法
分部類或結構可以包含分部方法。 類的一個部分包含方法的簽名。 分部方法聲明由兩個部分組成:定義和實現。
但是它的限制很多,只能在部分場景下使用。
-
分部方法聲明必須以上下文關鍵字 partial 開頭,並且方法必須返回 void。
-
分部方法可以有 ref 參數,但不能有 out 參數。
-
分部方法為隱式 private 方法,因此不能為 virtual 方法。
-
分部方法不能為 extern 方法,因為主體的存在確定了方法是在定義還是在實現。
-
分部方法可以有 static 和 unsafe 修飾符。
-
分部方法可以是泛型的。 約束將放在定義分部方法聲明上,但也可以選擇重復放在實現聲明上。 參數和類型參數名稱在實現聲明和定義聲明中不必相同。
-
你可以為已定義並實現的分部方法生成委托,但不能為已經定義但未實現的分部方法生成委托。
參考:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods
http://www.cnblogs.com/OpenCoder/archive/2009/10/27/1590328.html
c# partial 分部類和分部方法