最近大家都在讨论这篇文章 C与C++社区混战,C#会重蹈覆辙吗? ,闲着无聊也读了一下,发现果然还是太不能接受firelong的观点。

    按照firelong的观点,删除C#以下功能: 委托和事件,反射,特性,属性、索引器、析构器,JIT编译,泛型,Linq,dynamic。

    也许这些在firelong看来都是些烂特性,但是在不同的人眼中这些都是有非常重要的用途的特性。别的功能点先不说,我这里就说反射,特性和dynamic这三个

反射和特性

    反射不是c#本身的语言特性,是类库提供的功能。

    firelong说反射的用处很小,也许对大多数人来说是这样,但是如果写的是框架程序(插件框架、单元测试框架、WebService框架、WCF框架以及更多的框架),那离开反射基本就没法写了。

    然后说说特性,当然这个依赖于反射,如果没有反射,特性就没用了。

    个人认为特性是.net最重要的特点之一,离开它,估计全球的.net程序员都要多写一倍的代码。这绝对不是空穴来风,特性的最大特点是提供了契约式的代码编成方式。

    想想ms实现了Xml序列化,从此只要标记上几个特性,对象和xml之间就有了一座桥,可以任意转换。需要做的仅仅是告诉xml序列化器用什么样的方式去序列化。如果按照firelong说的用接口,好吧有个现成的接口IXmlSerializable,事实上根本没几个人会用这个接口来自己定制序列化,其次,为了实现这个接口所消耗的代码量将非常多,然后还要为这些代码做测试,发现并处理bug,一路上带来的成本开销将是非常惊人的。

    除了Xml序列化的优势,可以再想想WCF/WebService,不用特性和反射的话,就只能自己去侦听端口,分析request的内容,抓取其中的数据,在做各类运算/处理,将返回信息打包成一个response,再发送。这些多出来的工作量谁来承担?

   再说说单元测试,NUnit的反射+特性方式要是改成纯接口实现的版本?大家愿意用哪个?

dynamic

    最后说说dynamic,firelong说“去掉,真想dynamic,让ruby、python, f#等去做吧”,首先dynamic和f#没关系,f#也是静态类型,如果真的需要动态语言的部分,确实推荐使用ruby、python等原生的动态语言,恰恰因为这个c#才要dynamic。

    很有趣的是firelong认识到和其他语言的互操作(类似P/Invoke)的重要性,怎么却没认识到dynamic也是这个互操作的一部分。

    c#如何与这些动态语言互操作?在4.0里面当然是直接用dynamic,剩下的部分不需要关心,只要动态语言是建立在DLR之上的,就一定可以在c#中用dynamic来访问他们的成员。

    所以firelong提出不要dynamic,确实让我很诧异,想想原因,可能和很多人误用了dynamic有关,但是请别忘了dynamic的本职工作,不是为了方便反射,而是为了和动态语言的互操作。

小结

    c#不是为某一个人而创建的,所以,那些对你没用的东西,对别人未必没用。当然,如果觉得对你确实没用,完全可以不用,ms有没说不用xx特性就不让你编译失败。

    但是,不要因为你觉得没用,就要求删除这些功能。想想一个C程序员对你说,“面向对象有什么用,全部用函数不就做出来了”,你会真的把面向对象的部分去掉吗?

posted on 2010-06-22 10:16  Zhenway  阅读(3533)  评论(19编辑  收藏  举报