简单的来说
partial是局部类型的意思 就是说有这个关键字的类、结构或接口可以写成几个部分 比如 public partial class Program { static void Main(string[] args) { } } partial class Program { public void Test() { } } 编译后它相当于 public class Program { static void Main(string[] args) { } public void Test() { } }
下面作详细的分析:
partial关键字允许把类、结构或接口放在多个文件中。一般情况下,一个类存储在单个文件中。但有时,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的某部分,所以把类放在多个文件中是有益的。
partial关键字的用法是:把partial关键字放在class,struct或interface关键字前面。
我在下面用几个例子作说明:
含有三个类文件:PartialClassPart1.cs,PartialClassPart2.cs,Program.cs,两个部分类分别置于前面两个类文件中,各有一个方法。
【PartialClassPart1.cs】 using System; namespace PartialClass { partial class partialClass { public void Method1() { Console.WriteLine("PartialClassPart1-partialClass-Method1"); } } }
【PartialClassPart2.cs】 using System; namespace PartialClass { partial class partialClass { public void Method2() { Console.WriteLine("PartialClassPart2-partialClass-Method2"); } } }
代码执行类【Program.cs】 using System; namespace PartialClass { class Program { static void Main(string[] args) { partialClass Pc = new partialClass(); Pc.Method1(); Pc.Method2(); Console.ReadKey(); } } }
结果:
PartialClassPart1-partialClass-Method1
PartialClassPart1-partialClass-Method2
当然:这两个method的名字不能一样!
//BigClassPart1.cs [CustomAttribute] partial class TheBigClass:TheBigBaseClass,IBigClass { public void Method1(){}; } //BigClassPart2.cs [AnotherAttribute] partial class TheBigClass:IOtherBigClass { public void Method2(){}; }
编译后的结果: [CustomAttribute] [AnotherAttribute] partial class TheBigClass:TheBigBaseClass,IBigClass,IOtherBigClass { public void Method1(){}; public void Method2(){}; }
注意点,总结:
如果声明类使用了下面的关键字,这些关键字将应用于同一个类的所有部分:
public,private,protected,internal,abstract,sealed,new ,一般约束。
在嵌套的类型中,只要partial关键字位于class关键字的前面,就可以嵌套不分类。在把部分类编译到类型中时,会合并属性,XML注释,接口,泛型类型的参数属性和成员。
partial 关键字的作用是将你的 class 分为多个部分,编译器会将多个部分拼到一起去。
public partial class SampleClass { public void MethodA() { } } public partial class SampleClass { public void MethodB() { } } 和 public class SampleClass { public void MethodA() { } public void MethodB() { } } 是等价的。
我猜想这个东西出现的初衷是为了解决掉:“窗体设计器生成的代码”这个令人讨厌的 region。 对我们来说,在团队开发当中这个东西或许也会有点用处。 我观察了一下生成的 IL 代码,使用 partial 生成的代码并没有什么特殊的标记,这说明 partial 纯粹是语言的特性,CLR 完全不知道这么个玩意的存在,这也就意味着不要指望将 partial class 编译为 assembly 或者 module 什么的再与其他的人写的 partial class 去进行拼接:它只能在编译的时候起作用。 为了考验一下编译器,我试着让某一个 partial class 不显式指定父类,发现代码仍然能够正确的通过编译,编译器会按照某一个显式指定了父类的 partial 进行编译,只有在多个 partial 指定了不同父类时才会报错。同样,如果多个 partial 指定了自相矛盾的修饰符的话,编译时也会报错的。 有意思的是,我们还可以写以下这样的代码:
public partial class Sample ...{ public partial class SampleSon ...{ public partial class SampleGrandson ...{ } } } public partial class Sample ...{ public partial class SampleSon ...{ public partial class SampleGrandson ...{ } } }