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
适用场景 代码分离 多态扩展 添加静态方法

更多推荐