C# partial 关键字详解
partial关键字允许将类、结构、接口或方法的定义分散在多个文件中。编译器会在编译时将所有部分合并为一个完整的定义。主要用途1.分离关注点最常见Windows Forms、WPF、ASP.NET Core 等框架自动生成代码与用户代码分离// Form1.cs - 用户代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); // 调用设计器文件中的方法 } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(Hello); } } // Form1.Designer.cs - 设计器自动生成代码 partial class Form1 { private Button button1; private void InitializeComponent() { button1 new Button(); // 初始化代码... } }2.多开发者协作不同开发者可以同时修改同一个类的不同部分// File1.cs partial class Employee { public string Name { get; set; } public int Age { get; set; } } // File2.cs partial class Employee { public decimal Salary { get; set; } public void DisplayInfo() { Console.WriteLine(${Name}, {Age}, {Salary}); } }3.代码生成器工具生成的代码不会覆盖手动编写的代码// Generated.cs - 自动生成 partial class Customer { public int Id { get; set; } public string Name { get; set; } } // Custom.cs - 手动扩展 partial class Customer { public void Validate() { if (string.IsNullOrEmpty(Name)) throw new Exception(Name required); } }实际应用场景1.扩展自动生成的实体类// EF Core 生成的实体 public partial class Order { public int OrderId { get; set; } public DateTime OrderDate { get; set; } } // 手动添加业务逻辑 public partial class Order { public bool IsDelivered OrderDate DateTime.Now.AddDays(-7); public partial decimal CalculateTax(); // 部分方法声明 } // 在另一个文件中实现 public partial class Order { public partial decimal CalculateTax() { return TotalAmount * 0.1m; } }2.配合源生成器Source Generators// 标记部分类供源生成器使用 [GenerateRepository] public partial class UserRepository { // 源生成器会自动添加 CRUD 方法 } // 手动添加自定义查询 public partial class UserRepository { public async TaskUser FindByEmailAsync(string email) { // 自定义实现 } }3.嵌套部分类partial class OuterClass { partial class InnerClass { public void Method1() { } } } partial class OuterClass { partial class InnerClass { public void Method2() { } } }对比其他技术特性partial 类继承扩展方法访问私有成员✓✗✗添加新字段✓✓✗修改现有方法✓(重写)✓(重写)✗多文件协作✓N/A✓适用场景代码分离多态扩展添加静态方法