C# - 分部类和方法

本文关键字:方法 | 更新日期: 2023-09-12 17:38:40

在 C# 中,可以使用partial 关键字将类、结构、方法或接口的实现拆分到多个.cs文件中。 编译器将在编译程序时合并来自多个.cs文件的所有实现。

请考虑以下包含Employee类的EmployeeProps.csEmployeeMethods.cs文件。

EmployeeProps.cs

public partial class Employee
{
    public int EmpId { get; set; }
    public string Name { get; set; }
}

EmployeeMethods.cs

public partial class Employee
{
    //constructor
    public Employee(int id, string name){
        this.EmpId = id;
        this.Name = name;
    }
    public void DisplayEmpInfo() {
        Console.WriteLine(this.EmpId + " " this.Name);
    }
}

上面,EmployeeProps.cs 包含 Employee 类的属性,EmployeeMethods.cs 包含Employee类的所有方法。这些将编译为一个Employee类。

Example: Combined Class

public class Employee
{
    public int EmpId { get; set; }
    public string Name { get; set; }
    public Employee(int id, string name){
        this.EmpId = id;
        this.Name = name;
    }
    public void DisplayEmpInfo(){
        Console.WriteLine(this.EmpId + " " this.Name );
    }
}

分部类的规则

  • 所有分部类定义必须位于同一程序集和命名空间中。
  • 所有部分必须具有相同的可访问性,如公共或私有等。
  • 如果任何部分被声明为抽象、密封或基类型,则整个类被声明为同一类型。
  • 不同的部件可以有不同的基类型,因此最终类将继承所有基类型。
  • Partial 修饰符只能紧挨着关键字类、结构或接口之前出现。
  • 允许嵌套分部类型。

分部方法

分部类或结构

可以包含一个方法,该方法拆分为分部类或结构的两个单独的.cs文件。 两个.cs文件中的一个必须包含该方法的签名,另一个文件可以包含分部方法的可选实现。 方法的声明和实现都必须具有 partial 关键字。

EmployeeProps.cs

public partial class Employee
{
    public Employee() { 
        GenerateEmpId();
    }
    public int EmpId { get; set; }
    public string Name { get; set; }
    partial void GenerateEmployeeId();
}

EmployeeMethods.cs

public partial class Employee
{
    partial void GenerateEmployeeId()
    {
        this.EmpId = random();
    }
}

上面,EmployeeProps.cs 包含构造函数中使用的分部方法GenerateEmployeeId()的声明。 EmployeeMethods.cs包含GenerateEmployeeId()方法的实现。 下面演示如何使用分部方法创建Employee类的对象。

EmployeeMethods.cs

class Program
{
    static void Main(string[] args)
    {
        var emp = new Employee();
        Console.WriteLine(emp.EmpId); // prints genereted id
        Console.ReadLine();
    }
}

分部方法的规则

  • 分部方法必须使用 partial 关键字,并且必须返回 void
  • 分部方法可以具有inref,但不能具有out参数。
  • 分部方法是隐式私有方法,因此不能是虚拟的。
  • 分部方法可以是静态方法。
  • 分部方法可以是泛型的。

了解更多关于分部类和方法的信息here.