不常用。
在 C# 中,部分类(Partial Class) 是指一个类的定义可以分散在多个文件中,编译时 C# 编译器会自动将它们合并成一个完整的类。
这是通过 partial 关键字实现的,主要用于代码组织、自动生成代码与手动代码分离等场景。
✅ 1. 基本语法
使用 partial 修饰符:
// 文件:Person1.cs
public partial class Person
{
public string Name { get; set; }
public void SayHello()
{
Console.WriteLine($"Hello, I'm {Name}");
}
}
// 文件:Person2.cs
public partial class Person
{
public int Age { get; set; }
public void PrintAge()
{
Console.WriteLine($"I am {Age} years old.");
}
}
✅ 编译后,这两个部分会被合并成一个完整的 Person 类,包含 Name、Age、SayHello() 和 PrintAge()。
✅ 2. 为什么需要部分类?
场景 1:代码生成器 + 手动代码分离
- 比如 Windows Forms、WPF、Entity Framework 等工具会自动生成代码。
- 如果你直接修改生成的代码,下次重新生成时会被覆盖。
- 使用
partial,你可以把自动生成的部分和自己写的逻辑分开。
示例:Windows Forms
// Form1.Designer.cs(自动生成,不要手动改)
partial class Form1
{
private Button button1;
private void InitializeComponent() { ... }
}
// Form1.cs(你自己写的逻辑)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); // 调用 Designer 中的方法
button1.Click += (s, e) => MessageBox.Show("Clicked!");
}
}
💡 两个文件中的
Form1是同一个类!
场景 2:大型类拆分,提高可维护性
- 如果一个类有上千行代码,可以按功能拆到多个文件中。
- 比如:
UserService.Validation.cs、UserService.Database.cs等。
✅ 3. 使用规则(重要!)
| 规则 | 说明 |
|---|---|
所有部分必须用 partial 修饰 |
否则编译器认为是不同类 |
| 所有部分必须在同一程序集(项目)中 | 不能跨项目拆分 |
| 访问修饰符必须一致 | 比如不能一部分是 public,另一部分是 internal |
| 继承关系必须一致 | 如果某一部分继承了基类或实现了接口,其他部分不能重复声明(但可以补充接口) |
| 泛型参数必须相同 | partial class MyList<T> 的所有部分都要有 <T> |
✅ 正确示例(继承):
// Part1.cs
public partial class Student : Person
{
public string StudentId;
}
// Part2.cs
public partial class Student // 不需要再写 : Person
{
public void Study() { }
}
第二部分不需要重复写基类,但整个类最终是
Student : Person。
✅ 4. 也可以用于其他类型
partial 不仅可用于 class,还可用于:
-
struct -
interface -
方法(C# 13 预览版支持,但目前主流是类/结构/接口)
public partial struct Point { ... }
public partial interface ILogger { ... }
🚫 常见误区
❌ 误区1 :partial 是为了"运行时动态组合类"
✅ 正解 :partial 只在编译时生效,运行时就是一个普通类。
❌ 误区2 :可以在不同项目中拆分类
✅ 正解 :所有 partial 部分必须在同一个项目(程序集) 中。
✅ 小结
| 特点 | 说明 |
|---|---|
| 关键字 | partial |
| 作用 | 将一个类的定义拆到多个文件 |
| 主要用途 | 分离自动生成代码 & 手写代码、拆分大型类 |
| 编译结果 | 合并为一个完整类 |
| 适用类型 | class、struct、interface |
问题
部分类的用途?
是将大类拆分更多部分,当许多程序员共同开发这个类时特别有用。
是否可以创建部分类结构体
可以。