C#新增的特性中引起争议的有许多分部方法(Partial Method)算是一个分部方法通常被定义在一个分部类中在常规的类文件中也可实现如果分部方法没有被实现编译器就不会对他们进行编译
分部方法有着严格的限制它们必须是私有的不能返回值不能有输出参数因为任何针对没有被实现的分部方法的调用都会简单地被忽略所以说这些限制是非常有必要的反过又意味着分部方法不能作为一个明确分配的变量Visual Basic也有分部方法尽管VB不需要对变量的明确分配它也有同样的限制
有那么多的限制有人可能会问它们有什么优点?这个问题问得好基本上分部方法仅被代码生成器在处理轻量级事件的时候使用就像 Alexander Jung所解释的
分部方法通常(也可能是唯一相关的)的应用场景就是在代码生成的时候用于处理轻量级事件假设你解析一个数据库或者一个XML文件然后生成了数据类结果你会发现有数十个类几百个属性以及一大堆泛型和模板文件等分部方法另外一个经常被用到的地方是验证或者让属性的setter去更新另一个属性所以如果你要使用产生的代码或者在运行时有几百个事件和数千个方法调用的话( 其实大多数情况下只用到了其中的一点点)就让分部方法来吧分部方法在声明和使用时要比事件容易得多如果没有用到它们它们就会消失
性能的提升并不是没有代价的从分部方法必须是私有的限制中Alexander发现了它们的不足之处
缺点如果你喜欢元数据驱动的应用并且已经被ASPNET的数据绑定所困扰时(因为没有其他的方法可以附上元数据)……那么就准备着在将来丢失信息吧如果你需要为属性的setter增加一些事件(基于跟蹤和调试的需要)如果你需要某个动态的行为(比如附上某个通用规则引擎)等等那么就让我们祈祷代码分析器的开发人员能够预知这个场景(或者已经做好了准备)吧你有了一个清晰的层的分离那么实体就应该对UI一无所知吗?是的将代码直接放到数据类中会破坏层的关系但是你可以手动地用分部方法实现真正的事件啊
另外一些人对于C#中的分部方法也是忧虑重重大部分是关于代码设计器的使用的Stefan Wenig写道
首先我不是非常热衷于设计器我忧虑的是设计器也许很快就会将我们送上过去基于COM开发时的老路数百个设计器和向导产生了那么多没人想去看的ATL和MCF代码在我们陷于设计器
创建的无用文件和复杂的构建过程时使用Ruby的家伙们在笑因为他们用几行代码就可以解决(联想一下上世纪年代COM/C++和Java的比较)难道对于基于代码的开发人员生产率不是C#所首要考虑的(看看VB的设计器驱动的RAD路线图)?我们不应该再沉浸于基于设计器的企业类库思想的乐于使用软件工厂代码设计器的幻想中了团结起来抵制它们!