一、部分类定义
使用部分类定义,把类的定义放在多个文件中。例如,可将字段、属性和构造函数放在一个文件中,而把方法放在另一个文件中。为此,把包含部分类定义的每个文件中对类使用partial关键字即可,如下所示:
public partial class MyClass {...}
如果使用部分类定义,partial关键字必须出现在包含部分类定义的每个文件的与此相同的位置。
应用于部分类的接口也会应用于整个类,也就是说,下面的两个定义:
public partial class MyClass: IMyInterface1{...}
public partial class MyClass: IMyInterface2{...}
和
public class MyClass: IMyInterface1, IMyInterface2{...};
是等价的。
部分类定义可以在一个部分类定义问价或多个部分类定义文件中包含基类。但如果基类在多个定义文件中指定,它就必须是同一个基类,因为在C#中,类只能继承一个基类。
二、部分方法定义
部分类也可以定义部分方法(partial method)。部分方法在一个部分类中定义(没有方法体),在另一个部分类中实现。在这两个部分类中,都要使用partial关键字。
public partial class MyClass
{
partial void MyPartialMethod();
}
public partial class MyClass
{
partial void MyPartialMethod()
{
//Method implementation.
}
}
部分方法也可以是静态的,但它们总是私有的,且不能由返回值。它们使用的任何参数都不能是out参数,但可以是ref参数。部分方法也不能使用virtual、abstract、override、new、sealed或extern修饰符。
有了这些限制,就不太容易看出部分方法的作用了。实际上,部分方法的重要性体现在编译代码时,而不是使用代码时。考虑下面的代码:
public partial class MyClass
{
partial void DoSomethingElse();
punlic void DoSomething()
{
WriteLine("DoSomething() execution started.");
DoSomethingElse();
WriteLine("DoSomething() execution finished.");
}
}
public partial class MyClass
{
partial void DoSomethingElse() => WriteLine("DoSomethingElse() called.");
}
在第一个部分类定义中定义和调用部分方法DoSomethingElse(),在第二个部分类中实现它。在控制台应用程序中调用DoSomething()方法,输出如下内容:
DoSomething() execution started.
DoSomethingElse() called.
DoSomething() execution finished.
如果删除第二个部分类定义,或者删除部分方法的全部实现代码(或者注释掉这部分代码),输出就如下所示:
DoSomething() execution started.
DoSomething() execution finished.
编译代码时,如果代码包含一个没有实现代码的部分方法,编译器会完全删除该方法,还会删除对该方法的所有调用。执行代码时,不会检查实现代码,因为没有要检查的方法调用。这回略微提高性能。
与部分类一样,在定制自动生成的代码或设计器创建的代码时,部分方法是很有用的。设计器会声明部分方法,用户根据具体情形选择是否实现它。如果不实现它,就不会影响性能,因为在编译过的代码中并不存在该方法。