Dotnet -让我欢笑让我忧
断断续续接触.Net已经有1个月,大大小小的相关项目算起来接手了2个,毛毛草草看过的书籍加起来有3本,却想入非非的居然想4四代代用.net 编程。
不过,第一次和.Net 打交道时,对于一个习惯于c++程序短小精干快速运行的我而言,确实没有太多的惊喜,反而对那一堆自动生成的繁琐代码耿耿于怀。就像一个面试官对一个水平中上的求职者说:好吧,下个月来试一试吧, 至于IQ嘛,可决不是超过130的香饽饽。抱着这种抵制情绪,于是我继续在C++ MFC/ATL的道路上跋涉。 不过,接下来的使用让我改变了一些看法,首先在看到vb.net ,c#, c++.net和jsp.NET 居然可以使用近乎同样的包,而只是在语法上有一些可以接受差别。不禁感慨:哇舍,语言之间原来可以协同到这种地步,这不就是理想主义者追求的世界大同吗?厉害厉害。想当年,要尔等从一种语言到另外一种语言,程序库变化带来的学习曲线可不能小觑,这使得我对vb这样简单的东西也提不起学习的兴趣,抱着C++是天下第一是依天剑是屠龙刀的门户偏见,我眯着眼睛看其它语言的程序员,乐呵呵的调侃“聪明的程序员学xxx,真正的程序员学xxx”。
上个月在做一个外包过来的项目时,由于客户需要.net移植性,开始钻研C++.NET。抛开VC++7中托管代码的丑陋语法,直接使用C++/CLI,居然不太费劲就上手了,渐渐使用它的interop,.net assemby和本地dll之间的相互调用。哇喔,的确很不错哟,两种完全不同的内存管理模式可以协同操作,互通有无。赤溜溜的来,赤溜溜的去,托管和不托管之间,互操作挥挥手,不带走一片云彩。并且,.net下的程序集概念,比com或者com+简化好多。因为天生基于unicode神经元发达,同时构建于CLR之上骨架硬朗,.net在数据传输和共享上自然水到渠成。
公司最近上一个项目,开发环境的自由度大,于是在传统c++和 c++.net之间,我毅然选择了不太熟悉的.net。项目的界面比较多,花哨。这才的确发现.net 在设计人机界面上的优势。布局,不透明,图片按钮,字体,图标,菜单,消息控制,还有,数据库访问…吧啦吧啦,三下五除二,张三李四王二麻子排一下队,每一位取一个号然后在内存分配处报一下到。我再作为调度大将军double click发号司令,清清爽爽加几行代码一切搞定。看来Anders Hejlsberg的dephi优势在.net中的确大放光芒,microsoft挖他也没有白花银子。
项目涉及到多页tiff图像显示,这个在vc6时代可不是件容易的事,至今我还非常珍惜我那移动硬盘中的数千行程序。.net在这方面的本事让我给它90分。简单创建一个image对象,再控制一下图像帧(frame),一切就那么easy。并且图像旋转镜像等操作也简洁到只有一个函数调用。爱就一个字,爽也是一个字。没有给它100分,是因为image对象在我没有激活一个多业tiff 的某一frame时,一个赋值操作居然把每一frame都改为同样的图片这一点上耿耿于怀。
在向.net挺进的道路上,一切似乎都进展顺利,项目也近于完工,老板似乎也快要给发点年终盘缠了,这可是非常难得的。辛辛苦苦任劳任怨无非就是希望把那可怜的工资多涨点,有点年终奖或者项目奖安慰一下那已经快要熄灭的编程激情,多点孔方兄给心爱的老婆买个像样的圣诞礼物。但是,今天它让我犯一个低级错误使我好恨它。于是对.net的爱与奉承,都消散在风中。 VC6时代的 CString 对象,用 += ‘\’ 可以给字符串追加一个slash ;这个用过数百千遍的操作(当然通常是在一个目录不含slash的必需考虑的事情哟)。但是 对String 加一个char,在.net 下却被转义了。 += ‘\’ 变成加一个 « 92 »字符串,.net自动先把char的code值转化成字符串,再进行加操作。项目测试时没有考虑这个地方会出错,结果在客户那儿轻轻松松就捉住一只特大号的臭虫(bug)。后果嘛?挨批,没奖金,没心情,没…
呜呼哀哉!让我爱恨交加的.net. 特撰此文,以抒心意。并希望同行引以为戒,小心谨慎。