C#部分方法又叫分部方法。部分方法在一个部分类中定义(没有方法体),在另一个部分类中实现。两个部分类中,都要使用partial
关键词。
部分方法可以是静态的,但总是私有的,且不能有返回值。使用的任何参数都不能是out参数,但可以是ref 参数。部分方法也不能使用virtual、abstract、override、new、seale和extern修饰符。
public partial class MyClass{partial void MyPartialMethod();}public partial class MyClass{partial void MyPartialMethod(){//Method implementation}}
关于为什么部分方法不能有返回值,以下来自网友回答,相对来说能认同的一个回答,但最后一句明显有错误。
“分部方法”的引入完全是为了代码注入的需要同时保持代码的高效。
比如说:partial void OnBefore(string s);partial void OnAfter(string s);...void SomeFunction(){OnBefore(...); 业务代码; OnAfter(...); }
这是一个典型的场景,作为API的设计者,我们希望给调用它的程序员一个添加注入代码(比如权限审查、调试输出、或者日志等行为)的机会。
如果没有分部方法,那么OnBefore和OnAfter始终会被调用,哪怕这两个方法是空的。
有了分部方法,如果程序员不去写这两个方法,那么编译器会自动删除SomeFunction中的第一行和最后一行。
我们想想,如果这个分部方法是有返回值的,那么难保SomeFunction的编写者会写出这样的代码:int result = OnBefore(...);...此时我们还能去掉这一行么?如果去了,那result哪里出呢?
一样的道理,out ref相当于给返回值,所以也被禁止。