zoukankan      html  css  js  c++  java
  • 己所不欲,勿施于人

        最近大家都在讨论这篇文章 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程序员对你说,“面向对象有什么用,全部用函数不就做出来了”,你会真的把面向对象的部分去掉吗?

  • 相关阅读:
    [USACO09Open] Tower of Hay 干草塔
    [HNOI2004]打鼹鼠
    BZOJ1222[HNOI 2001]产品加工
    BZOJ1270[BJWC2008]雷涛的小猫
    NOIP2018出征策
    解析·NOIP·冷门 CLZ最小环
    CCF-NOIP-2018 提高组(复赛) 模拟试题(九)(2018 CSYZ长沙一中)
    [脚本无敌1]图片批量处理(matlab)
    用Matlab解《2013年数据建模比赛》图像碎片拼接题
    火灾检测-fire,fire
  • 原文地址:https://www.cnblogs.com/vwxyzh/p/1762450.html
Copyright © 2011-2022 走看看