解析C#中的分部类和分部方法

2019-12-26 17:27:27王振洲
  • new 修饰符(嵌套部分)
  • 泛型约束

    示例 1
    下面的示例在一个分部类定义中声明 CoOrds 类的字段和构造函数,在另一个分部类定义中声明成员 PrintCoOrds。

    
    public partial class CoOrds
    {
      private int x;
      private int y;
    
      public CoOrds(int x, int y)
      {
        this.x = x;
        this.y = y;
      }
    }
    
    public partial class CoOrds
    {
      public void PrintCoOrds()
      {
        Console.WriteLine("CoOrds: {0},{1}", x, y);
      }
    
    }
    
    class TestCoOrds
    {
      static void Main()
      {
        CoOrds myCoOrds = new CoOrds(10, 15);
        myCoOrds.PrintCoOrds();
    
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
      }
    }
    
    
    

    输出:

    
    CoOrds: 10,15
    

    示例 2

    从下面的示例可以看出,您也可以开发分部结构和接口。

    
    partial interface ITest
    {
      void Interface_Test();
    }
    
    partial interface ITest
    {
      void Interface_Test2();
    }
    
    partial struct S1
    {
      void Struct_Test() { }
    }
    
    partial struct S1
    {
      void Struct_Test2() { }
    }
    
    

    分部方法
    分部类或结构可以包含分部方法。类的一个部分包含方法的签名。可以在同一部分或另一个部分中定义可选实现。如果未提供该实现,则会在编译时移除方法以及对方法的所有调用。
    分部方法使类的某个部分的实施者能够定义方法(类似于事件)。类的另一部分的实施者可以决定是否实现该方法。如果未实现该方法,编译器将移除方法签名以及对该方法的所有调用。调用该方法,包括调用中的任何计算结果,在运行时没有任何影响。因此,分部类中的任何代码都可以随意地使用分部方法,即使未提供实现也是如此。如果调用了未实现的方法,将不会导致编译时错误或运行时错误。
    在自定义生成的代码时,分部方法特别有用。这些方法允许保留方法名称和签名,因此生成的代码可以调用方法,而开发人员可以决定是否实现方法。与分部类非常类似,分部方法使代码生成器创建的代码和开发人员创建的代码能够协同工作,而不会产生运行时开销。
    分部方法声明由两个部分组成:定义和实现。它们可以位于分部类的不同部分中,也可以位于同一部分中。如果不存在实现声明,则编译器将优化定义声明和对方法的所有调用。

    
    // Definition in file1.cs
    partial void onNameChanged();
    
    // Implementation in file2.cs
    partial void onNameChanged()
    {
     // method body
    }