1、C#中部分方法总是私有的?
假如你是类的设计者,设计出某个部分类如MyClass。当你把这个类设计完后,别人就可以用这个类。
对于类的使用者来说,类的外观就是各种public的属性、字段和方法。
假如,你在MyClass中定义了一个部分方法SendFile用来传输文件,但是你没有提供这个方法的实现代码。
现在类的使用者知道MyClass类中有个public方法SendFile可以用来传输文件,他并不知道这个方法是不是部分方法。
他以为这个方法肯定可以使用,而你却没有提供实现代码!
人家会以为文件正常传输了,但是其实他被你“欺骗了”。
所以,为了导致这种悲剧发生,就让部分方法都定义为private的。
结果就是,即使这种欺骗行为再次发生,那也是自己骗自己,不会欺骗类的使用者。
客户是上帝。
2、C#中部分方法的参数必须是ref参数,而不能是out参数?
我们可以把类中的方法看成是一个机器,我们可以用这个机器帮我做某些事情。
对于out参数,就好像是我们在对这个机器说“嘿,帮我生产一个东西,我下面需要用”。
注意out参数可以在使用之前未赋值,只是声明了而已。
而一个只声明却未赋值的变量,是不会存在内存中的。
只有当赋值后,才会把这个变量压入栈中。
这意味着,你坚定,这台机器肯定存在,肯定能运作,肯定能帮你生产出你想要的东西,接着你又会放心地使用机器生产出来的东西。
结果悲剧了,你用的是部分方法,且这个部分方法没有被实现。
也就是说,你用了一个根本不存在的机器,尝试生产一个根本不存在的东西,还被你反复地用来用去。
在代码中,就是在操作一个根本不存在的变量。
这可以么?当然不可以。
但是,如果这个参数是ref的,这倒没什么问题,如果是ref,那么首先意味着这个变量是存在的。
依然把方法看成机器。
现在你是让机器帮你加工下,而不是生产。
即使这个机器不帮你加工也没事,我这个物品还是存在的,当我下面继续使用这个物品时,不会再出现“操作一个根本不存在的物品”这个悲剧了。
3、部分方法不能用virtual、abstract、override、new、sealed和extern修饰符
拿virtual来说
如果一个部分方法是虚拟的,意味着派生类可以重写这个部分方法。
重写一个方法,就要用到关键字override
结果,你没有实现这个部分方法
那么当编译器在编译程序时,会因未找到部分方法的方法体而删除这个方法。
意味着基类中不存在某个虚拟方法
而你还在基类中悠哉地使用override关键字来重写那个已经被删除的方法。
肯定不让你通过编译。
其他的类似。
4、为什么部分方法不能有返回值
原因和out参数是一样的,你期待这个机器给你生产出个东西,但是没有,而你接着却用了某个不存在的东西。
5、总结:
为什么要给部分方法设置这么多条件。
一句话概括:怕你用了根本不存在东西!!!