2023-03-28
编程语言
00

目录

概念
1. 为什么使用 partial ?
2. partial 关键字的用法
2.1 基本语法
示例:拆分 Player 类
3. partial 的应用场景
3.1 拆分大型类
3.2 自动生成代码(WinForms / EF)
4. partial 的限制
5. partial 适用于结构体和接口
示例:partial struct
示例:partial interface
6. partial 和 partial method(分部方法)
示例:分部方法

概念

partial 关键字允许 将一个类、结构体或接口的定义拆分到多个文件中,在编译时,它们会被合并为一个完整的类型。

1. 为什么使用 partial

  • 多人协作开发:将类拆分到多个文件,避免多人修改同一个文件导致的冲突。
  • 自动生成代码:有些框架(如 WinForms、Entity Framework)会自动生成部分代码,而 partial 允许开发者在另一个文件中扩展该类,而不修改自动生成的代码。
  • 提高代码可读性:将大型类拆分成多个文件,提高代码组织性。

2. partial 关键字的用法

2.1 基本语法

多个 partial 关键字修饰的类在编译时会合并成一个完整的类。

拆分出来的类的所有类名必须保持一致!

示例:拆分 Player

📌 Player_Part1.cs

csharp
public partial class Player { public string Name { get; set; } public int Health { get; set; } public void TakeDamage(int amount) { Health -= amount; } }

📌 Player_Part2.cs

csharp
public partial class Player { public void Heal(int amount) { Health += amount; } }

📌 使用 Player

csharp
class Program { static void Main() { Player player = new Player { Name = "Warrior", Health = 100 }; player.TakeDamage(20); player.Heal(10); Console.WriteLine($"{player.Name} has {player.Health} HP."); } }

编译后,Player 类的所有成员都会合并在一起


3. partial 的应用场景

3.1 拆分大型类

当类的代码量过大时,可以拆分到不同的 partial 文件,提高代码可读性和管理性。

3.2 自动生成代码(WinForms / EF)

Windows 窗体应用程序(WinForms) 中,设计器会生成 .Designer.cs 文件,开发者可以在主文件中扩展该类,而不影响自动生成的代码。

示例(WinForms 自动生成部分): 📌 Form1.Designer.cs(自动生成的 UI 代码)

csharp
public partial class Form1 : Form { private Button myButton; private void InitializeComponent() { this.myButton = new System.Windows.Forms.Button(); this.myButton.Text = "Click Me"; } }

📌 Form1.cs(开发者扩展的逻辑代码)

csharp
public partial class Form1 : Form { public Form1() { InitializeComponent(); myButton.Click += (s, e) => MessageBox.Show("Hello, World!"); } }

开发者的逻辑代码不会影响自动生成的 UI 代码


4. partial 的限制

  • 必须在同一命名空间和程序集内,不能跨程序集定义。
  • 不能用于单个方法,但可以用于 类、结构体、接口
  • 必须保持相同的访问修饰符publicinternal 等)。
  • 不能定义不同的基类(即所有 partial 片段必须继承相同的基类或接口)。

5. partial 适用于结构体和接口

除了 类(class) 之外,partial 还可以用于 结构体(struct)和接口(interface)

示例:partial struct

csharp
public partial struct Point { public int X { get; set; } } public partial struct Point { public int Y { get; set; } }

结构体 Point 仍然是一个完整的结构体,包含 XY 两个属性

示例:partial interface

csharp
public partial interface IAnimal { void Eat(); } public partial interface IAnimal { void Sleep(); }

接口 IAnimal 依然是一个完整的接口,包含 EatSleep 两个方法


6. partialpartial method(分部方法)

partial method 只允许在 partial 类或结构体中定义,通常用于 自动生成代码的占位,如果没有实现,编译器会忽略它。

示例:分部方法

csharp
public partial class GameCharacter { partial void OnDamageTaken(); // 声明分部方法 } public partial class GameCharacter { partial void OnDamageTaken() // 实现分部方法 { Console.WriteLine("Character took damage!"); } }

本文作者:xuxuxuJS

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!