一、实现的效果
C#的分部关键字(partial)能够拆分一个类、一个结构、一个接口或一个方法为两个或更多个的文件,分部的每个文件都可以包含自己的类型和方法,程序编译时会将同类的分部内容合并为一个。
这是关于《分部类(partial)和方法》的示例程序工程https://download.csdn.net/download/xiaochenXIHUA/85236324
二、分部类
2.0、类的修饰符
序号 | 类修饰符 | 类修饰符说明 |
1 | new | ①new用作修饰符时【用于嵌套类表示类隐藏同名的继承成员】 ②new用作关键字时【用于对类进行实例化(如创建对象)】 |
2 | public | 【访问无限制】public可将类从程序集-->命名空间中将类暴露出去,供其他程序集或命名空间使用 |
3 | private | 【仅限于为其他类成员时访问】private限制只有在该类为其他类的成员时才能修饰,不能直接修饰类。 |
4 | protect | 【仅限于派生类访问】Protect限制在类成员之间,常用于子类继承父类,父类用Protect修饰,此时子类可以访问父类用Protect修饰的内容,其他类则不能访问 |
5 | internal | 【仅限于当前程序集访问】internal限制类只可以在一个程序集中相互自由访问 |
6 | abstract | 【修饰为抽象类、不能实例化】abstract修饰类可作为基类、派生类 |
7 | sealed | 【修饰为密封类、不能为基类】sealed修饰的类不能被继承 |
8 | static | 【修饰为静态类】static修饰的类在程序运行时就直接开辟内存,可以直接通过类名调用静态类的成员、方法,而不用实例化该类 |
注意:partial
修饰符不可用于委托或枚举声明中 。
2.1、分部类
序号 | 分部类功能说明 |
1 | 分部类必须使用关键字【partial】修饰,且必须在【class】前 |
2 | 各个分部类都必须具有相同的访问性 |
3 | 如果任意分部类声明为抽象(密封),则整个类都被视为抽象(密封) |
4 | 如果任意分部类继承父类,则整个类都继承父类 |
5 | 在任意分部类声明的属性、结构、接口都可以让其他分部类使用 |
6 | 各个分部类可以指定不同的接口,最终类将实现所有分部类的所有接口 |
2.1.1、分部类的使用场景
序号 | 分部类使用场景说明 |
1 | 使用自动生成的源文件时,自动创建的源文件为一个内容,而对应的逻辑处理业务为一个内容,互不干扰,两个文件的内容可以相互调用【常见的形式是:Winform创建的窗体程序,设计的界面为一个文件(如:界面名称.Designer.cs),而对应的按钮触发事件业务逻辑在一个文件中(如:界面名称.cs)】 |
2 | 开发大型项目时,需要多个程序员编写同一个类中的不同功能模块,此时就可以使用分部关键字(partial)各自创建相同类不同名称的文件编辑自己的功能模块,互不干扰 |
3 | 需要对源生成器的类添加扩展功能且不能修改原生成器类,可以使用分部类实现 |
2.1.2、分部类的形式
//公有的分部类
public partial class PersonBase
{
public void RecordKnowledge()
{
Console.WriteLine($"{this.GetType().Name} 在记录知识");
}
}//Class_end
//私有分部类
private partial class PersonBase
{
public void RecordKnowledge()
{
Console.WriteLine($"{this.GetType().Name} 在记录知识");
}
}//Class_end
//公有抽象分部类
public abstract partial class PersonBase
{
public void RecordKnowledge()
{
Console.WriteLine($"{this.GetType().Name} 在记录知识");
}
}//Class_end
//分部接口
partial interface IPerson
{
/// <summary>
/// 具备的技能
/// </summary>
void SelfSkill(string skillContent);
/// <summary>
/// 使用的工具
/// </summary>
void UseTool();
}//Class_end
//分部抽象基类
public abstract partial class PersonBase:IPerson
{
public void SelfSkill(string skillContent)
{
Console.WriteLine($"{this.GetType().Name} 掌握的技能为:{skillContent}");
}
protected void RecordKnowledge()
{
Console.WriteLine($"{this.GetType().Name} 在记录知识");
}
public void UseTool()
{
Console.WriteLine($"{this.GetType().Name} 会使用工具");
}
}//Class_end
//艺术家分部类继承自公有分部抽象的PersonBase基类
partial class Person: PersonBase
{
public void ArtCreate()
{
Console.WriteLine("\n------------------------------------------");
Console.WriteLine($"艺术家对大家说:好久不见,各位");
Console.WriteLine($"{this.GetType().Name} 艺术家家进行艺术创作");
Console.WriteLine("------------------------------------------\n");
}
}//Class_end
//数学家分部类可以直接使用公有分部抽象的PersonBase基类方法
partial class Person
{
public void Thinking()
{
Console.WriteLine("\n------------------------------------------");
Console.WriteLine($"数学家对大家说:嘿,我在这");
Console.WriteLine($"{this.GetType().Name} 数学家进行思考");
base.RecordKnowledge();
base.UseTool();
Console.WriteLine("------------------------------------------\n");
}
}//Class_end
三、分部方法
分部类可以包含分部方法【即:允许在一个分部类里面定义方法,而在另一个分部类里面实现这个方法】;常用于【生成样板代码的模板】;但是分部方法只能用于【Void】方法;如下所示:
partial class Person
{
//【定义】拥有证书的分部方法
partial void HaveCertificate();
}//Class_end
partial class Person
{
//实现分部类定义的【拥有证书的分部方法】
partial void HaveCertificate()
{
Console.WriteLine($"这是数学家实现的证书");
}
}//Class_end