偶与.NET的第一次接触

    已经做了好几年基于Windows平台的技术开发,在现公司也已工作快两个年头。对早已兴起的.NET的相关知识却不甚了了,实在是说不过去。近日得闲,花了点时间。粗略的翻看了一下相关资料。不敢说学会了什么,甚至谈不上入门,但qo实,有些体会,有话在喉,不吐不快。
    如某卫视主持人言:偶来策一策。

    前阵子,公司请了个MS的讲师来公司培训,内容呢,C#的基础知识。果然,讲得很基础,凭着对Java的一知半解和很久之前一本C#入门,偶也能勉强听懂。但,也多多少少留下了一串问号(装箱?非托管资源回收?……)。于是,俺从书中去找寻答案。

    总有人问(嘿,或许是在自已问自已), 你做软件的,都会个啥?
    偶开始冥思苦想,答曰:一堆。一堆Windows的内核机制(内存,线程,消息……),一堆API,一堆COM……,一堆MFC库,一堆VB函数库,一堆ATL函数库,一堆(个头都比较大,要不就要称为一坨了)……。而这些,当然是Made by Microsoft。这样看来,MS好象是个原材料供应商,来,村料给你,建狗屋还是摩天大厦,您请自便? 噢,MS提供的全是材料而非方法,解决问题的方法在哪里?你会说了,有啊,我们有UML,我们有设计模式。
    是这样吗?在2006年的今天,MS还会这么土鳖?显然,MS并非只提供了VISIO,并非只提供了VSS,进入.NET,偶才发现,MS也是授人予渔地。

    好了,俺闲话少说,开始进入.NET。

    首先,请往前看,在正前方,您看到的那个庞然大物的名字叫.NET Framework,是了,它是用来取代API和COM的。原有Windows世界的DLL方式被颠覆,曾经的DLL Hell据说不存在了。无头仓蝇乱找API的烦恼没有啦,COM带来的垃圾注册表也被环保啦(变为类java的目录方式了),形势真的不是小好,而是一片大好啊。真是这样吗?嘿,比尔先生最会吹牛,实际上,原有的都还在,只不过藏得更深了。而为了兼容,一切似乎变得更复杂了。
嗯,请继续往前看,据说:.NET可以跨平台了,因为它有了中间层。嘿,我倒不觉得这有啥意义,倒是由此产生的中间语言,进而演化出的统一开发环境,却着实解决了不同语言间用晦涩的COM来通讯的苦恼(我敢说,一些多年开发的程序,至今也不了解COM到底是什么鬼东东)。

    好了,说半天,还没说到语言,程序员该不习惯了,有了CLR,有了IL,但俺们总不能用IL来编程。   

    Of course,.NET世界中,C#最牛。

    对于Dephi原作者一手打造的C#,MS的描述是:  一种简洁、类型安全的面向对象的语言。
    对此,我的不完全的理解是:
     简洁:说实在话,初一接触,它不会让人觉得简洁。至少它的关键字比C++多出不少,规则也添加了一些。不过,仔细一看,嘿,多出的关键字和规则,那完全是为了俺们编程方便,更少出错。例如:纯Class编码方式,让它涣然一新,它比以前的语言更面向对象罗。总之,比之MS对C++改造之VC,qo实还是好了不少。
     类型安全:这种说法,貌似很常见。简单来说,也就是不允许如C++中的强制类型转换,好处呢,它使编译器可以检查出更多的错误,当然,这并不是多管闲事,它使你的代码更健壮。更深了来说,你看看.NET的元数据机制,它实际上就是基准于此点假设而来。而正是有了元数据,才有了全新的.NET。
     面向对象:qo实,它完全继承了C++的面向对象的特性,并推陈出新(嘿,有人说,抄Java的吧。一部分啦。)

    说到语言特性,俺的心里也有个一二三四。 
    1:接口
    嗯,我把它排在第一。
    它的意义并不仅仅在于替代C++中的不合理的多重继承。它的意义在于设计模式。有些只接触高层应用开发的程序员,总会问:什么是设计模式。其实,接口就是一种彻彻底底的设计模式。也就是说,它最大的意义是改变的是程序员的思考方式,改变程序的知识积累方式。具体,只能在项目中体会,俺也说不出来。

    2:垃圾回收
    如果你曾是一个C++程序员,你可能需要改变一下你的编程方式了。
    如果你是一个VB程序员。恭喜你,你可能从此摆脱了低效率的帽子。
    看清垃圾回收的原理后,你可以发现它比想象中更加强大,强大到什么程度,在某此时候,它比C++的内存管理方式更高效。注意:在拉圾回收的前提下,你的代码不再象C++中那样脆弱。
    说到效率,可以仔细说说垃圾回收的算法的优秀,这里,并不仅指简单的一个方法内的对象生存期判定,实际上,回收的算法较复杂且有一些前提。
    垃圾回收最关键的是一张表,在JIT编译器生成的表:它包括了本地代码偏移和方法中引用根的映射关系。
    如:
    0x0000000 - 0x000000020      arg1,arg2
    在算法中,关键是引用根的识别。CLR中,因为不允许类似C++中的强制转换,所以,它始终能知道一个对象的实际类型,从而使用元数据信息来判断一个对象的哪些成员引用着其它对象。这实在是很强大。也就是说,这就要求类型不被强制转换。
    很可惜,非托管C++允许我们将一个指针转为任意的其它类型指针。如果要再去解析哪些是不合理的强制转换,显然不可行(如跨二进制的应用)。于是,C++之上,是无法应用类似的垃圾回收的。

    3: 异常处理
    VB中,采用全局错误码结合On Error的编程方式来捕获错误。记得几天前,有位同事还发过一个VB中错误使用Error捕获的程序分析。错误来源于不合理含混不清的错误处理机制,全新的异常处理将完全根除此类问题。
    C++中也提供异常处理机制,不过很遗憾,其上层框架库并未提供足够的异常类,比如MFC,廖廖可数的几个异常类,使VC的开发人员对异常机制且放且用,一直怀疑。
    .NET中,异常处理全新应用。并贯穿于.NET所有函数库。其对开发人员指导意义颇大,使用异常处理,会改善代码结构。
     不过,令我纳闷的是:在语法规格上,C#并不严格,甚至没有C++中的并不必需的声明机制,相对Java,更是差之甚远。我认为:这一点对于用户自定义Class的使用者非常重要,不知MS出于何种考虑,去掉相应设置。

     4: 反射
    在Windows API中,有用GetProcAddress来获取函数指针。在MFC中,也有反序列化机制来生成对象。或许,个人也会编写代码来实现对象的序列化和反序列化。但,在使用时,总有些不适应。不适应在于它没有严格的理论基础。这本该是一门专业的课题。
    同Java一样,.NET中有了反射。有人将反射作为Java的第一大发明,而我却将它在C#中的意义排到最后,因为,我没怎么用过它。我怀疑它的效率和适用性。也因为偶从来没开发过什么需要异常灵活的框架?也没开发过类似Corba一样的高级服务组件,
    且慢,在公司的BOS Stuio的设计器中,倒似乎可以用上反射的机制。

     先扯到这儿,有空再扯……
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值