讨论C#分部方法

开发 后端
这里介绍C#分部方法,C#新增的特性中引起争议的有许多,分部方法(Partial Method)算是一个。分部方法通常被定义在一个分部类中,在常规的类文件中也可实现。

C#新增的特性中引起争议的有许多,分部方法(Partial Method)算是一个。分部方法通常被定义在一个分部类中,在常规的类文件中也可实现。如果分部方法没有被实现,编译器就不会对他们进行编译。

分部方法有着严格的限制。它们必须是私有的,不能返回值,不能有输出参数。因为任何针对没有被实现的分部方法的调用都会简单地被忽略,所以说这些限制是非常有必要的。反过又意味着,分部方法不能作为一个明确分配的变量。Visual Basic也有分部方法,尽管VB不需要对变量的明确分配,它也有同样的限制。

有那么多的限制,有人可能会问,“它们有什么优点?”。这个问题问得好,基本上,C#分部方法仅被代码生成器在处理轻量级事件的时候使用。就像 Alexander Jung所解释的 :

分部方法通常(也可能是***相关的)的应用场景就是在代码生成的时候用于处理轻量级事件。假设你解析一个数据库或者一个XML文件,然后生成了数据类,结果你会发现有数十个类、几百个属性以及一大堆泛型和模板文件等。分部方法另外一个经常被用到的地方是验证,或者让属性的setter去更新另一个属性。所以如果你要使用产生的代码,或者在运行时有几百个事件和数千个方法调用的话( 其实大多数情况下只用到了其中的一点点),就让分部方法来吧。分部方法在声明和使用时要比事件容易得多,如果没有用到它们,它们就会消失。

性能的提升并不是没有代价的。从分部方法必须是私有的限制中,Alexander发现了它们的不足之处:

缺点:如果你喜欢元数据驱动的应用,并且已经被ASP.NET的数据绑定所困扰时(因为没有其他的方法可以附上元数据)……那么,就准备着在将来丢失信息吧。如果你需要为属性的setter增加一些事件(基于跟踪和调试的需要),如果你需要某个动态的行为(比如附上某个通用规则引擎)等等,那么就让我们祈祷代码分析器的开发人员能够预知这个场景(或者已经做好了准备)吧。你有了一个清晰的层的分离,那么实体就应该对UI一无所知吗?是的,将代码直接放到数据类中会破坏层的关系,但是你可以手动地用分部方法实现真正的事件啊。

另外一些人对于C#分部方法也是忧虑重重,大部分是关于代码设计器的使用的。Stefan Wenig写道:

首先,我不是非常热衷于设计器。我忧虑的是设计器也许很快就会将我们送上过去基于COM开发时的老路,数百个设计器和向导产生了那么多没人想去看的ATL和MCF代码。在我们陷于设计器、创建的无用文件和复杂的构建过程时,使用Ruby的家伙们在笑,因为他们用几行代码就可以解决(联想一下上世纪90年代COM/C++和Java的比较)。难道对于基于代码的开发人员生产率不是C#所首要考虑的(看看VB的设计器驱动的RAD路线图)?我们不应该再沉浸于基于设计器的,企业类库思想的,乐于使用软件工厂代码设计器的幻想中了。团结起来,抵制它们!

Ayende Rahien也没有嘴软:

让我们一起埋葬这些代码设计器吧,竖起C#分部方法的辉煌墓碑!

【编辑推荐】

  1. C#生产者和消费者
  2. 详细介绍C#基础知识
  3. C#正则表达式学习笔记
  4. 简单描述C#存储过程
  5. 浅析C#基于TCP协议
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-10 17:00:14

C#分部方法

2009-08-18 09:22:47

应用场景C#分部方法

2009-08-12 16:22:29

C#插件技术

2009-08-13 16:13:03

C#基础知识

2009-09-16 09:00:15

C#数组C#指针

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2010-01-05 16:20:46

.NET Framew

2009-08-17 17:40:53

C# GetAllCu

2009-08-26 17:16:22

C# CheckSta

2009-08-26 09:50:08

C# GreetPeo

2009-09-28 09:32:01

编译语言C#

2009-11-02 17:38:56

VB.NET与C#

2009-11-02 17:15:42

C#转换为VB.NET

2009-08-31 18:05:14

C#调用WalkTre

2009-08-25 17:07:27

C#虚拟方法

2009-09-07 10:37:32

C#执行Finaliz

2009-08-25 16:16:43

C# oledbcon

2009-08-31 16:33:28

C#调用Dispose

2009-08-19 14:42:21

C#重载LoadPos

2009-09-11 09:15:06

C# get方法
点赞
收藏

51CTO技术栈公众号