分部类和分部方法通过partial关键字将类或方法拆分到多个文件,编译时合并,支持多人协作与代码生成;分部类需同名、同命名空间、同程序集,用于分离设计器生成代码与手动代码;分部方法为void返回、隐式private,仅在实现存在时生效,常用于OnChanging等钩子;C#9起支持返回值但未实现会编译失败;不可跨程序集拆分,避免滥用以降低维护成本。

分部类和分部方法是 C# 提供的语法特性,核心作用是把一个类或方法的定义拆到多个文件中,既支持多人协作开发,也天然适配代码生成场景(比如设计器、ORM 或 gRPC 工具生成的代码)。
分部类:让一个类“住”在多个文件里
用 partial 关键字声明的类,编译器会在编译时把所有同名的 partial class 合并成一个完整类。所有部分必须在同一程序集、同一命名空间、修饰符一致(如都是 public),且不能重复定义相同成员(字段/方法等)。
- 常见用途:UI 设计器(WinForms/WPF)自动生成的代码与用户逻辑代码分离,避免手动修改被覆盖
- 团队协作时,不同开发者可分别维护模型类的数据结构部分和业务验证部分
- 实体类配合 EF Core 使用时,常将数据库映射逻辑放在生成文件,业务方法写在另一份 partial 类中
分部方法:可选的“钩子”,专为代码生成设计
分部方法必须定义在分部类中,声明和实现可以分开——只有当实现存在时,调用才生效;若未实现,编译器会直接移除调用语句,不产生任何开销。它必须是 void 返回、无访问修饰符(隐式 private)、不能有 extern/virtual/override/abstract 等修饰符。
- 典型场景:在生成的类中预留 OnPropertyChanging、OnSaving 等回调点,由人工编写的 partial 类实现具体逻辑
- 避免因生成工具更新覆盖自定义代码,同时保持轻量——没实现就等于不存在
- 注意:C# 9 起支持返回值和 ref/out 参数,但调用前仍需确保已实现,否则编译失败
使用时要注意的几个细节
分部不是万能胶,滥用反而增加理解成本。实际用的时候得守住几条线:
- 所有 partial class 文件必须用相同类名、相同命名空间,且都在同一个项目(.csproj)里
- 不能跨程序集拆分——即 A.dll 里的 partial class 不能和 B.dll 里的同名 partial class 合并
- 分部方法不能有默认参数,也不能是泛型方法的特化形式(但可以是泛型方法本身)
- 调试时 IDE 通常能跳转到任意一部分,但需确认所有 partial 文件都已加载且未被排除在编译之外
基本上就这些。合理用好 partial,能让生成代码和手写逻辑各司其职,既安全又清爽。










