在许多情况下,您可能需要拆分类的定义,例如在大型项目中工作时,多个开发人员和程序员可能需要同时处理同一个类。在这种情况下,我们可以使用称为 **结构类 (Partial Class)** 的功能。
结构类简介
在 C# (或 OOP) 编程中,我们可以将类的定义拆分到两个或多个源文件中。源文件包含类定义的某个部分,所有部分在应用程序编译时组合在一起。要拆分类定义,我们需要使用 `partial` 关键字。
示例 1
我们有一个名为 `HeightWeightInfo` 的项目,用于显示身高和体重。
我们有一个名为 `File1.cs` 的文件,其中包含一个名为 `Record` 的结构类。它有两个整数变量 `h` 和 `w` 以及一个名为 `Record` 的方法/构造函数,用于为 `h` 和 `w` 赋值。
namespace HeightWeightInfo
{
class File1
{
}
public partial class Record
{
private int h;
private int w;
public Record(int h, int w)
{
this.h = h;
this.w = w;
}
}
}
这里是另一个名为 `File2.cs` 的文件,其中包含相同的结构类 `Record`,它只有一个 `PrintRecord` 方法。此方法将显示 `h` 和 `w` 的值。
namespace HeightWeightInfo
{
class File2
{
}
public partial class Record
{
public void PrintRecord()
{
Console.WriteLine("Height:"+ h);
Console.WriteLine("Weight:"+ w);
}
}
}
现在我们可以在项目中看到 `main` 方法
namespace HeightWeightInfo
{
class Program
{
static void Main(string[] args)
{
Record myRecord = new Record(10, 15);
myRecord.PrintRecord();
Console.ReadLine();
}
}
}
在这里,我们将类 `Record` 的对象命名为 `myRecord`,它将参数值 10 和 15 分别传递给 `File1.cs` 中定义的 `h` 和 `w` 方法。
`PrintRecord` 方法通过对象 `myRecord` 调用,该对象在 `File2.cs` 中定义。
这表明 `partial` 关键字有助于将定义在各种文件中的类的所有属性组合在一起,作为一个单一的类进行工作。
可以使用结构类的地方
- 在处理大型项目且有多个开发人员时,它可以帮助开发人员同时处理同一个类。
- 可以在不重新创建 IDE (例如 Visual Studio) 自动生成的源文件的情况下,向类添加或修改代码。
关于结构类的注意事项
`partial` 关键字指定类的其他部分可以在命名空间中定义。如果我们要使类成为结构类,则必须使用 `partial` 关键字。类的所有部分都应位于同一命名空间中,并在编译时可用以形成最终类型。所有部分必须具有相同的访问修饰符,即 `private`、`public` 等。
- 如果任何部分被声明为 `abstract`,则整个类型被视为 `abstract`。
- 如果任何部分被声明为 `sealed`,则整个类型被视为 `sealed`。
- 如果任何部分声明了基类,则整个类型将继承该类。
- 在结构定义中声明的任何类成员都可供其他所有部分使用。
- 结构类的所有部分都应位于同一命名空间中。
**注意:** `partial` 修饰符不能用于委托或枚举声明
结构方法简介
结构类可以包含结构方法。类的一部分包含方法的签名。可选的实现可以在同一部分或另一部分中定义。如果未提供实现,则在编译时将方法及其所有调用删除。
示例 2
我们以 `file1.cs` 中定义的结构类 `Car` 为例,它包含三个方法 `InitializeCar()`、`BuildRim()` 和 `BuildWheels()`。其中,`InitializeCar` 被声明为 `partial`。
public partial class Car
{
partial void InitializeCar();
public void BuildRim() { }
public void BuildWheels() { }
}
我们还有一个名为 `file2.cs` 的文件,其中包含两个方法 `BuildEngine` 和 `InitializeCar`。`InitializeCar` 方法是结构方法,它也在 `file1.cs` 中定义。
public partial class Car
{
public void BuildEngine() { }
partial void InitializeCar()
{
string str = "Car";
}
}
结构方法声明由两部分组成
- 定义,如 `file1.cs` 所示。
- 实现,如 `file2.cs` 所示。
它们可以位于结构类的不同部分,也可以位于同一部分。
关于结构方法的注意事项
- `partial` 关键字。
- 返回类型为 `void`。
- 隐式为 `private`。
- 并且不能是 `virtual`。