Partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。
适用范围:
(1)类型特别大,不适合放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。(如设计模式中的“模板方法”。模板方法就是把所有相同功能都写在父类中,需要有变化的方法在父类中写成虚方法,然后在子类中重写虚方法,因此模板方法利用partial实现了代码的利用。)
(3)一个类同时需要多个人编写。
注意事项:
(1)只适用于类、接口、结构,不支持委托和枚举。
(2)同一个类型的各个部分必须有修饰符partial。
(3)使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4)一个类型的各个部分必须同时被编译。
(5)partial只有和class、struct、interface放在一起时才表示局部类型。
(6)一个类型的各部分子类的访问修饰符必须保证一致性。
(7)若其中一个部分类使用了static/abstract/sealed修饰符,则整个类都是静态类/抽象类/密封类。(后面会有static/abstract/sealed的详解)。一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。
(8)局部类型的累加效应。
//第一种情况:特性累加效应
//Attribute2属性允许在类上多次使用
[Attribute1,Attribute2("Hello")]
partial class Func1{}
[Attribute3,Attribute2("Exit")]
partial class Func1{}
//等价于
[Attribute1,Attribute2("Hello"),Attribute3,Attribute2("Exit")]
class Func{}
//第二种情况:接口累加效应
partial class Func2 : Interface1 , Interface2 {}
partial class Func2 : Interface3 {}
partial class Func2 : Interface2 {}
//等价于
class Func2 : Interface1 , Interface2 , Interface3 {}