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 Task<User> 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 | ✓ |
| 适用场景 | 代码分离 | 多态扩展 | 添加静态方法 |
更多推荐
所有评论(0)