partial
关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或更多的文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。在设计 Framework 时,可以充分利用 partial
这个特性。
什么情况下需要拆分类定义呢?
例子
将 Coords 类 分部在 2 个文件中定义。
CoordsOne.cs
定义了 Coords 类的构造函数
注意签名 partial class Coords
namespace ConsoleApp1.PartialClass { public partial class Coords { private int x; private int y; public Coords(int x, int y) { this.x = x; this.y = y; } } }
CoordsTwo.cs
定义了 Coords 类的一个方法
注意签名 partial class Coords
namespace ConsoleApp1.PartialClass { public partial class Coords { public void PrintCoords() { Console.WriteLine("Coords: {0},{1}", x, y); } } }
TestPartial.cs
测试一下上面的分部类
using ConsoleApp1.PartialClass; namespace ConsoleApp1 { internal class TestPartial { static void Main(string[] args) { Coords coords = new Coords(10, 20); coords.PrintCoords(); } } }
结果:
Coords: 10,20
处理分部类定义时需遵循下面的几个规则:
partial
进行修饰。例如,下面的类声明会生成错误:
public partial class A { } //public class A { } // Error, must also be marked partial
partial
修饰符只能出现在紧靠关键字 class
、struct
或 interface
前面的位置。partial class ClassWithNestedClass { partial class NestedClass { } } partial class ClassWithNestedClass { partial class NestedClass { } }
要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(.exe 或 .dll 文件)中进行定义。 分部定义不能跨越多个模块。经测试这些分部的文件必须在同一命名空间
。
还是上面的例子,CoordsThree.cs 也定义成 partial
类,但是相比 CoordsOne.cs 和 CoordsTwo.cs 不是在同一个命名空间,会出错。
将 CoordsOne.cs 中 public 改成 internal,产生访问属性冲突。
同理,也可以开发分部结构和接口
partial interface ITest { void Interface_Test(); } partial interface ITest { void Interface_Test2(); } partial struct S1 { void Struct_Test() { } } partial struct S1 { void Struct_Test2() { } }
分部方法在分部类型的一部分中定义了签名,并在该类型的另一部分中定义了实现。 通过分部方法,类设计器可提供与事件处理程序类似的方法挂钩,以便开发者决定是否实现。 如果开发者不提供实现,则编译器在编译时删除签名。 以下条件适用于分部方法:
partial
开头。partial
关键字。例如:
namespace PM { partial class A { partial void OnSomethingHappened(string s); } // This part can be in a separate file. partial class A { // Comment out this method and the program // will still compile. partial void OnSomethingHappened(String s) { Console.WriteLine("Something happened: {0}", s); } } }
在以下情况下,不需要使用分部方法即可实现:
C# - this 的用法 一文中有介绍 this 具有扩展类方法的功能,那么 this
和 partial
有区别是?
this
是对原有功能进行扩展,partial
是将整体分成多个部分存放,便于维护。patial
分部的签名要求一致,必须是 partial
class/interface/struct Name,文件名不一样。
this 扩展类名不一样,但必须是静态的类,静态的方法,方法第一个参数必须是 this
ClassName
partial
分部的各个文件必须在同一 namespace 命名空间this
扩展可以在不同命名空间,但是需要导入扩展的 namespace 命名空间后才能调用扩展的方法。