日期:2014-05-16  浏览次数:21405 次

为什么说C#的部分方法必须是私有的,且不能有返回值?
而且,使用的任何参数都不能是out 参数,但可以是ref 参数。
------解决方案--------------------
http://bbs.csdn.net/topics/350263383?page=1
------解决方案--------------------
这个问题稍微想想一点不难理解。
如果一个分部方法没有实现,那么编译器根本就不会为它产生代码。以及对它的调用的代码。
我们看下为什么分部方法不能是public的?你想,public的方法影响了一个类的外观,如果编译器不编译这个方法,这个类平白无故少了一个方法,这算什么事?
为什么分部方法不能有返回值,一个道理。如果有返回值,那么当你用变量去接收返回值,这段代码能被省略么?
------解决方案--------------------
你会把你的钱给别人吗?你的钱就是私有的;

你那钱买了一碗饭,那你就是传入了一个参数(钱),返回了 一碗饭;

你那钱买了一碗饭然后吃了,那你就没返回值;

------解决方案--------------------
顺便讲一下,“分部方法”的引入完全是为了代码注入的需要同时保持代码的高效。

比如说:
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相当于给返回值,所以也被禁止。