C# 部分类和部分方法

在许多情况下,您可能需要拆分类的定义,例如在大型项目中工作时,多个开发人员和程序员可能需要同时处理同一个类。在这种情况下,我们可以使用称为 **结构类 (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` 关键字有助于将定义在各种文件中的类的所有属性组合在一起,作为一个单一的类进行工作。

可以使用结构类的地方

  1. 在处理大型项目且有多个开发人员时,它可以帮助开发人员同时处理同一个类。
  2. 可以在不重新创建 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";
    }
}

结构方法声明由两部分组成

  1. 定义,如 `file1.cs` 所示。
  2. 实现,如 `file2.cs` 所示。

它们可以位于结构类的不同部分,也可以位于同一部分。


关于结构方法的注意事项

  • `partial` 关键字。
  • 返回类型为 `void`。
  • 隐式为 `private`。
  • 并且不能是 `virtual`。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战