编程十年 (8):歪打正着C#
编程十年 (8):歪打正着C#
思路回来,接着混吧。2002年,大二。学校开设了面向对象和编译原理的课程。早在学习VB的时候,我就听说过面向对象的概念;而在大一的时候,也知道了编译器是一个神奇的玩意儿,能写出编译器才算牛逼。所以,我打算好好学一下这两门课。
面向对象使用Java语言授课,那个时候虽然Java出现已经有些年头了,但对于我们还是一个新鲜玩意儿。另外,那个时候的Java还处在一个频繁发展的时期,学校课程安排的是Java 1.1,但实际上课的时候Java已经发展到了1.4(应该叫Java2了吧),后来很快Java5、Java6就出来了。所以,学习起来还是比较痛苦的。那个时候虽然网络已经比较发达了,但因为上网只能去机房或者网吧,而在网吧学习太过另类,所以网络并没有在学习Java上帮太多忙。
另外,IDE也成为我无法对Java产生浓厚兴趣的原因之一。上课时老师推荐的开发环境是BlueJ,我至今也不明白为什么要给我们推荐这个环境,这玩意是以速度缓慢著称的,以当时学校机房的机器配置,打开BlueJ要花大概3到5分钟的时间。而那个时候Eclipse在校园里还不是很流行。
幸好学校机房装有Visual Studio,里面包含了一个Visual J++。其实我也不知道J++和Java有关,完全是凭猜测,在Visual J++里写了一段Java代码,发现还真能兼容。于是那会儿的作业基本上是在Visual J++里完成的。所以说到底,还是被绑在了微软的平台上。
我不喜欢Java还因为它的语法和程序组织结构。抛出的异常都要列在方法头里——在写方法头的时候我怎么知道要抛哪些异常?通常都是随心所欲地抛出异常;或者根据对错误情况的细化,会改变抛出异常的类型。所有这些都势必要修改方法头,这对快速构建都会产生不小的影响。关键字太过冗长——虽然extends、implements看上去非常直观,但不免有点Basic的影子,与C奉行的简约风格格格不入。每个文件只能放一个公共类——这意味着,不管我的试验性程序有多么短小,只要出现了多于一个的公共类,就必须建立多个源文件。如果没有一个顺手的IDE,编译起来会比较麻烦。这个特征使得学习Java的成本无形中增加了不少。
不过,Java语言有一点我非常之欣赏,就是去掉了C/C++语言中头文件的概念,方法不必事先声明,只要在整个程序的作用域中进行了定义,就可以直接调用。本来嘛,方法定义里已经完全包含了声明中的所有信息,何必单独写一份声明呢?
这里提到C++,是的,在这个时候我已经接触过一些C++的知识了,也看过了两本著名的C++图书——《The C++ Programming Language》和《Thinking in C++》。但也只在Turbo C++里写过少量练习程序,没做过什么实际的东西。
当然,以上种种只是我个人对Java的感受而已,并不代表这种语言不好。所以各位偏爱Java的看客敬请蛋定,就当是哥蛋疼好了。
正好同年开设了编译原理课程,在学习的过程中不免YY着自己能写一个编译器出来。对于Java的不喜爱,也加深了我YY的情结。于是,我开始幻想有一门新奇的面向对象语言。这门语言应该像C一样简约,包括关键字和符号(而且能用符号的地方绝不用关键字);像VB一样直观,面向对象中提到的属性、方法、事件必须样样俱全;像Java一样新潮,不用写方法声明。当然,关键字最好能与C/C++统一,不要像Java那样管using叫import,管namespace叫package……(又忍不住蛋疼了,淡定,淡定。)
当然,YY是YY,日子还得过。最终的结果是,编译原理上了几节课以后就再也不去了,学完了词法分析就放弃了。写程序依然是用C,但不停地在学C++;对Java只能是不冷不热,凑合着学够考试就完了;而遇到需要GUI的程序,还是得请出眼看就要被束之高阁的VB。
终于,我对没法用C/C++写出GUI程序忍无可忍了。起因是期末的课程设计,必须用面向对象语言实现——开明,并没有限制必须用Java;但是却明确说明不可以使用VB。作出的程序必须要有GUI界面——这无疑相当于给我这个排斥Java的人判了个死刑。虽然当时为了计算机图形学课程的作业,我用C写了一套窗口库(基于graphics.h的),可那只是基于DOS的,只能显示简单的窗体和控件,与当时Windows系统上流行的程序相去甚远。而且,因为对内存管理并不是特别熟,所以内存泄露问题也很严重,程序跑个几分钟就会死掉,只能勉强应付有一两个窗口的小程序。
无奈之下,只好求助于Visual C++。我在上大学期间,也看过一些Visual C++的书,但这类书往往都只介绍MFC,所以我一直也没搞清楚Visual C++和C++的关系,不过用VC可以开发GUI程序,这我倒是记住了。由于是VB出身,所以我理所当然地认为所有的GUI开发都应该是通过拖控件、处理事件的方式完成的;于是我兴致满满地打开Visual C++,摸索着创建了一个MFC程序,然后就傻眼了——没有窗体设计器啊;运行起来也和VB写的程序不一样,不是一个空空的、有着控件背景色的窗体,而是一个白白的窗口,还自带菜单和工具栏。我觉得不行,这么凭空摸索不是事儿啊,必须看书。
上大学有了图书馆,能免费借书看了,我基本上也不怎么买书了。而且以那时候的经济条件(虽然家里条件已经好起来了,但父母对我依然很苛刻),我的生活费勉强够活着就不错了,也只能去图书馆借书看。
谁曾想,不想用Java而想用VC应付课设的人那么多,图书馆的VC书竟然被借光了。当然,这也有数理学院的贡献,据说他们也要做课设,也要用C++。
北工大的图书馆挺高级的,在借阅区外面有一小块区域,有几台电脑,可以查询要借的书在哪个位置,也能预约和续借图书,可谓方便之极。但我在往来于查询中心和书架之间几个来回之后,我苦恼的放弃了。其实,电脑上的查询系统还是很智能的,能告诉你每本书的状态。但是,很多书明明没有标记成已借出,在书架上却找不到,这是为什么呢、为什么呢、什么呢、么呢、呢……
于是我干脆放弃查询了,锲而不舍地穿梭于计算机分类的各个书架中,口中念念有词:Visual C++、Visual C++……终于,功夫不负有心人,我找还真到了一本。就是看上去不是很专业——为了美观,竟然把C++的两个加号重叠起来了,印成了C#。算了,有总比没有强,就是这本了。
上学的时候看书很没有章法,通常就是拿起来乱翻,就算偶尔有顺序地看书,也是要跳过目录前言甚至第一章的。于是麻烦了,我直接从书上找到第一段示例代码,就开始往Visual C++里敲。敲着敲着我就纳闷儿了,C语言不是以main函数开始的么,怎么书上写的是Main?有可能是用Word写的书,被它的“自动句首大写”搞的吧,我假装安慰自己。
结果可想而知,程序根本没法运行。我把责任归于出版社,怎么能这么不负责呢,虽说代码只是对其他内容起到辅助的作用,但也要保证正确啊。于是这本书就被我丢开了,和那些没人看的教科书一起埋没在电脑的后面。
不过,这次注定我和.NET有缘。不久之后的一天,我在宿舍玩电脑的时候突然内急,大号。话说我在上大学之前就已经养成了每天至少一次大便的规律,这习性至今都让我沾沾自喜,尤其看到什么十男九Z、十女十Z之类的说法时。而且,我在便便的时候还有一个好习惯,就是看书。这一日,因为内急发作,慌不择路之下随手从电脑后面抄出一本书,拽上点卫生纸就杀奔了厕所。
第一波攻势来得急迫且猛烈,我无暇顾他,专心迎战。汹涌的先锋军冲过之后战场进入了平静期,我缓缓地吐了口气,给自己点上一支烟,然后开始研究手里这本书。所谓无巧不成书,有缘千里来相会——慌乱之下竟然把这本打算放弃的“烂书”拿来了。但是没办法,人在蹲坑身不由己,看吧。
因为实在懒得看代码,干脆看看前言吧——这玩意儿也只有上厕所的时候才会想看。这一看非同小可,前言的一开始讲了一个有趣的故事,我这才恍然大悟。原来Visual C#是微软新推出的一款语言,这只是整个.NET平台的冰山一角而已。然后就是长篇累牍的吹捧,说C#是如何如何先进,如何如何面向对象等等。我突然闪现过一个念头,这语言和我当初YY过的那种语言有点像。
于是我迫不及待地打扫战场冲回宿舍,电脑也不玩了,直接把自己扔到床上继续研究这本书。在快速浏览了一些讲语法的内容之后,我爱上了这门语言。