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 struct
csharppublic partial struct Point
{
public int X { get; set; }
}
public partial struct Point
{
public int Y { get; set; }
}
✅ 结构体 Point
仍然是一个完整的结构体,包含 X
和 Y
两个属性。
partial interface
csharppublic 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 许可协议。转载请注明出处!