部分方法定义

  部分类也可以定义部分方法。部分方法在一个部分类中定义(没有方法体),在另一个部分类中实现。在这两个部分类中,都要使用 partial 关键字。

  1. public partial class MyClass
  2. {
  3. partial void MyPartialMethod();
  4. }
  5. public partial class MyClass
  6. {
  7. partial void MyPartialMethod()
  8. {
  9. // Method implementation
  10. }
  11. }

  部分方法也可以是静态的,但它们总是私有的,且不能有返回值。它们使用的任何参数都不能是 out 参数,但可以是 ref 参数。部分方法也不能使用 virtualabstractoverridenewsealedextern 修饰符。

  有了这些限制,就不太容易看出部分方法的作用了。实际上,部分方法的重要性体现在编译代码时,而不是使用代码时。考虑下面的代码:

  1. public partial class MyClass
  2. {
  3. partical void DoSomethingElse();
  4. public void DoSomething()
  5. {
  6. Console.WriteLine("DoSomething() execution started.");
  7. DoSomethingElse();
  8. Console.WriteLine("DoSomething() execution finished.");
  9. }
  10. }
  11. public partial class MyClass
  12. {
  13. partial void DoSomethingElse()
  14. {
  15. Console.WriteLine("DoSomethingElse() called.");
  16. }
  17. }

  在第一个部分类定义中定义和调用部分方法 DoSomethingElse(),在第二个部分类中实现它。在控制台应用程序中调用 DoSomething() 方法时,输出如下内容:

  1. DoSomething() execution started.
  2. DoSomethingElse() called.
  3. DoSomthing() execution finished.

  如果删除第二个部分类定义,或者删除部分方法的全部实现代码(或者注释掉这部分代码),输出就如下所示:

  1. DoSomething() execution started.
  2. DoSomething() execution finished.

  读者可能认为,调用 DoSomethingElse() 时,运行库发现该方法没有实现代码,因此会继续执行下一行代码。但实际上,编译代码时,如果代码包含一个没有实现代码的部分方法,编译器会完全删除该方法,还会删除对该方法的所有调用。执行代码时,不会检查实现代码,因为没有要检查的方法调用。这会略微提高性能。

  与部分类一样,在定制自动生成的代码或设计器创建的代码时,部分方法是很有用的。设计器会声明部分方法,用户根据具体情形选择是否实现它。如果不实现它,就不会影响性能,因为在编译过的代码中并不存在该方法。

  现在考虑为什么部分方法不能有返回类型。如果可以回答这个问题,就可以确保完全理解了这个主题,我们将此留作练习。