C#学习笔记 -- 分部类、分部方法

发布时间 2023-05-21 18:34:39作者: Phonk

1、分部类和分部类型

类的声明可以分割成几个分部类的声明

  • 每个分部类的声明都有一些成员的声明

  • 类的分部类声明可以在同一文件中也可以在不同文件中

  • 每个分部类声明必须被标注为patial class

partial class MyPartClass //类名称与下部分相同
{
    member1 delaration
    member2 delaration
}
partial class MyPartClass //类名称与上部分相同
{
    member3 delaration
    member4 delaration
}

如下代码块文件, 可以被分割成两个文件

class MyPartClass
{
    public void OutPut1(int inVal) {...}
    public void OutPut2(int inVal) {...}
}
partial class MyPartClass
{
    public void OutPut1(int inVal) {...}
}
partial class MyPartClass
{
    public void OutPut2(int inVal) {...}
}
注意
  1. 类型修饰符partial不是关键字, 所以在其他上下文中, 可以在程序中把它用作标识符

  2. 但是直接用在关键字class、struct或interface之前, 它表示分部类型

VS为标准Windows程序模板使用了这个特性, 如果从标准模板创建ASP.NET项目 WPF项目, 模板会为每一个Web页面、表单或窗体创建两个类文件.对于ASP.NET后WindowsForms

  • 一个文件中的分部类包括由VS生成的代码, 声明类页面上的组件, 你不应该修改这个文件中的部分类, 因为在修改页面组件时, VisualStudio会重新生成他

  • 另一个文件包含的分部类可用于实现页面或表单组件的外观和行为

除了分部类, 还可以创建

  • 局部结构

  • 局部接口

2、分部方法

分部方法是声明在分部类中不同部分的方法, 分部方法不同部分在分部类的不同部分中, 也可以声明在同一个部分中, 分部方法的两个部分都如下

  • 定义分部方法声明

    • 给出签名和返回类型

    • 声明的实现部分只是一个分号

  • 实现分部方法声明

    • 给出签名和返回类型

    • 以普通的语句块形式实现

注意
  1. 定义声明和实现声明的签名和返回类型必须匹配, 签名和返回类型都有如下特征

    • 返回类型必须是void

    • 签名不能包括访问修饰符, 这使得分部方法是隐式私有的

    • 参数列表不能包含out参数

    • 定义声明和实现声明中都必须包含上下文关键字partial, 并且直接放在关键字void之前

  2. 可以有定义部分而没有实现部分, 在这种情况下, 编译器把方法的声明以及方法内部任何对方法的调用都移除, 不能只有分部方法的实现部分而没有定义部分

例子
  • PrintSum声明在分部类不同部分, 定义声明在第一个部分中, 实现声明在第二个部分, 实现部分打印出两个整型参数的和

  • 因为分部方法是隐式私有的, 所以PrintSum不能从类的外部调用, 方法Add是调用PrintSum的公有方法

  • Main创建类的一个对象, 并调用它的公有方法, 公有方法调用PrintSum, 打印出输入参数的和

//分部类, 定义分部方法
partial class Program720
{
    //定义分部方法, 分部方法返回值必须为空
    partial void PrintSum(int x, int y);
​
    //使用分部方法
    public void Add(int x, int y)
    {
        PrintSum(x, y);
    }
}
​
//分部类, 实现分部方法
partial class Program720
{
    //实现分部方法, 分部方法返回值必须为空
    partial void PrintSum(int x, int y)
    {
        Console.WriteLine($"分部方法PrintSum实现部分, 结果为:{x + y}");
    }
}
static void Main(string[] args)
{
    Program720 program720 = new Program720();
    program720.Add(1, 2);
}