partial 关键字允许 将一个类、结构体或接口的定义拆分到多个文件中,在编译时,它们会被合并为一个完整的类型。
partial ?partial 允许开发者在另一个文件中扩展该类,而不修改自动生成的代码。partial 关键字的用法多个 partial 关键字修饰的类在编译时会合并成一个完整的类。
拆分出来的类的所有类名必须保持一致!
Player 类📌 Player_Part1.cs
csharppublic partial class Player
{
public string Name { get; set; }
public int Health { get; set; }
public void TakeDamage(int amount)
{
Health -= amount;
}
}
📌 Player_Part2.cs
csharppublic partial class Player
{
public void Heal(int amount)
{
Health += amount;
}
}
📌 使用 Player 类
csharpclass 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 类的所有成员都会合并在一起。
partial 的应用场景当类的代码量过大时,可以拆分到不同的 partial 文件,提高代码可读性和管理性。
在 Windows 窗体应用程序(WinForms) 中,设计器会生成 .Designer.cs 文件,开发者可以在主文件中扩展该类,而不影响自动生成的代码。
示例(WinForms 自动生成部分):
📌 Form1.Designer.cs(自动生成的 UI 代码)
csharppublic partial class Form1 : Form
{
private Button myButton;
private void InitializeComponent()
{
this.myButton = new System.Windows.Forms.Button();
this.myButton.Text = "Click Me";
}
}
📌 Form1.cs(开发者扩展的逻辑代码)
csharppublic partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
myButton.Click += (s, e) => MessageBox.Show("Hello, World!");
}
}
✅ 开发者的逻辑代码不会影响自动生成的 UI 代码。
partial 的限制public、internal 等)。partial 片段必须继承相同的基类或接口)。partial 适用于结构体和接口除了 类(class) 之外,partial 还可以用于 结构体(struct)和接口(interface)。
partial structcsharppublic partial struct Point
{
public int X { get; set; }
}
public partial struct Point
{
public int Y { get; set; }
}
✅ 结构体 Point 仍然是一个完整的结构体,包含 X 和 Y 两个属性。
partial interfacecsharppublic partial interface IAnimal
{
void Eat();
}
public partial interface IAnimal
{
void Sleep();
}
✅ 接口 IAnimal 依然是一个完整的接口,包含 Eat 和 Sleep 两个方法。
partial 和 partial method(分部方法)partial method 只允许在 partial 类或结构体中定义,通常用于 自动生成代码的占位,如果没有实现,编译器会忽略它。
csharppublic partial class GameCharacter
{
partial void OnDamageTaken(); // 声明分部方法
}
public partial class GameCharacter
{
partial void OnDamageTaken() // 实现分部方法
{
Console.WriteLine("Character took damage!");
}
}
本文作者:xuxuxuJS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!