c#局部类
partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类
使用事项
关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量
适用于以下情况
- 类型特别大,不宜放在一个文件中实现
- 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起
- 需要多人合作编写一个类
类型限制
- 局部类型只适用于类、接口、结构,不支持委托和枚举
- 同一个类型的各个部分必须都有修饰符 partial
- 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中
- 个类型的各个部分必须被同时编译
累加效应
在局部类型上的特性具有“累加”效应。
[Attribute1, Attribute2("Hello")]
partial class Class1{}
[Attribute3, Attribute2("Exit")]
partial class Class1{}
//相当于
[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 {}
基类和接口
一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}
//相当于
class Class2: Iinterface1, Iinterface2, Iinterface3 {}
局部类型修饰符
- 一个类型的各个部分上的访问修饰符必须维持一致性。
- 如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类。
- 如果一个类型有一个部分使用了 sealed 修饰符,那么整个类都将被视为密封类。
- 一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。
局部类使用
声明必须使用partial关键字
public partial class MyClass
{
// class implementation
}
可以像普通类一样使用
MyClass myObject = new MyClass();
myObject.MyMethod();
示例代码:
partial class MyClass
{
private int myField;
public void MyMethod()
{
Console.WriteLine("MyMethod called.");
}
}
在另一个文件中,可以使用相同的类名和partial关键字来声明该类的另一个部分:
partial class MyClass
{
private string myOtherField;
public void MyOtherMethod()
{
Console.WriteLine("MyOtherMethod called.");
}
}
这两个部分将组合成一个完整的类。
myObject = new MyClass();
myObject.MyMethod();
myObject.MyOtherMethod();
输出:
MyMethod called.
MyOtherMethod called.