Visual Basic(特指Visual Basic 6.0及其以前的版本,以下简称VB)在软件界一直是令大家尴尬的一个话题。一方面它的用户量高居不下,甚至一度成为全世界拥有程序员数量最多的开发语言;一方面只要是一个人在某个场合提到自己是VB程序员,向他投射过来的目光绝对令人窒息,VB程序员一开始就好像比C++、Java等矮了一大截。我本来以为这是“同行相轻”在国内程序员圈子中的延续,只管自己修炼就是。可是后来慢慢在国外的一些技术上也能感觉到这样一股笼罩在VB周围的阴霾气息。以至于最后看到Don Box先生为Programming Distributed Applications with COM+ and Microsoft Visual Basic(Ted Pattison著)一书写的序言之后,我对VB的信心彻底遭到粉碎。Don Box先生在序言中写到VB被大家视作一张“社会安全网”,是一款专门用来为那些能力低下的开发人员提供“社会福利”的程序设计语言。尽管这是Don Box先生的一种调侃,并且他在那篇序言中是力挺VB,而且毫不掩饰地宣称Dim me As VBProgrammer,可那时候年轻气盛的我显然不能接受这样的“侮辱”,这也促成了我早年在VB方向上的匆匆出走。

    后来我虽然“逃脱”了VB,但也渐渐认识一些将VB发挥得淋漓尽致的企业应用高手,以及一些将VB剖析得鞭辟入里的名家大师,从而也慢慢对VB有了新的认识:VB有VB的历史地位,VB有VB的用武之地。虽然在那个时候我对于VB已经摈除了早期的戒备心理,但如果有朋友问我学习VB怎么样,我还是持不赞成的态度。理由很简单,VB已经无法融入当今各种炉火纯青的对象组件技术,还有它近乎陡峭的学习曲线——不得不承认的一个事实是几乎所有的VB高手和大师都拥有着COM技术的深厚背景,这是VB的技术渊源,形与影不可能分离。而取道COM对于大多数纯VB出身的人来讲近乎一场噩梦,这有VB的历史原因和微软的定位因素。这两个软肋无法解决,VB就无法真正登堂入室,而且很有可能面临被分化和抛弃的命运。

    那些伟大的公司之所以伟大就在于他们总能在历史的转折关头做出正确的决定。随着.NET大潮的澎湃,VB被微软全面翻新,Visual Basic .NET(以下简称VB.NET)诞生了。

    VB.NET对于VB是一个划时代的里程碑。.NET带给VB的决不仅仅是一个创新的概念标签,它给予VB从底层运行时、编程方式、框架类库到应用程序模型等等以彻底的革命和提升,VB至此得以步入高端企业级开发的殿堂,和C++、Java、C#等主流程序设计语言平起平坐。以前笼罩在VB头顶上所有的不公正、怀疑、和委屈都一扫而空。.NET为VB进行了一场彻头彻尾的正名运动,重塑了VB在软件开发界的地位。

    实际上,这场正名运动的对象不光是VB这门语言,当然也包括和它息息相关的开发人员。随着这场正名运动的开展,VB程序员也从此得以踏上程序人生的康庄大道。

    然而为VB正名容易,正视VB.NET的价值容易,学习掌握VB.NET就不是那么容易的事情了。还要走VB时代可视化拖拉控件编程的老路吗?不,当然不是,如果还是沿着这条老路走,那么VB.NET将会不可避免地再次蒙羞。实际上,我本人并没有对可视化拖拉控件的编程方式有多大的成见,恰恰相反,在做企业应用项目开发时,我还是非常鼓励项目组成员使用高级IDE中各种方便的Wizard。只是这一切必须建立在对程序设计语言及其运行机制游刃有余的掌握这一前提之上。从某种角度来看,与其说是VB让使用它的程序员蒙羞,不如说程序员学习VB的方式让VB蒙羞。如果一个程序员一开始就使用IDE中的Wizard来构建应用程序,而弃程序设计语言本身的语法语义、编译机制、运行机制等于不顾,那么他不可能步入程序设计的殿堂。而VB由于本身的语言构造和微软对它的定位等因素,很容易将程序员导向这一误区,末了又用COM树立起一座高墙。这就像长长的一马平川之后突然竖起一座悬崖峭壁,很多人过不去是可以理解的。所以虽然有了.NET的正名,我们却决不能忽视对VB.NET学习方法的探究。要想彻底掌握VB.NET,必须选择一条正确的道路。

    在本书中,Jeffrey Richter 和 Francesco Balena就为我们指出了这样一条最佳路径——那就是从底层运行时学起。底层不是FUD(害怕、不确定、怀疑),而是真真切切的结构,是可以剖析、认识、从而驾驭的知识体系。在.NET平台中,.NET框架占据着核心的位置,是所有.NET程序设计语言的“底层”。相对于.NET框架而言,具体的语言学习已经是一个仅限于语法表达的次要问题了。实际上任何一门.NET编程语言提供的功能都只是.NET框架下一个子集的映射,如果您阅读本书后掌握了.NET框架中各个核心的概念后,掌握和精通任何一门.NET编程语言都将是一件非常轻松的事情。本书涵盖了.NET框架技术中几乎所有重要的概念和机制:程序集,元数据,引用类型与值类型(装箱/拆箱),类型成员,接口,特性,委托,异常处理,垃圾收集,反射等等。涵盖这些技术本身并不难,难的是如何用平实的语言和简短的代码来为读者建立起有关它们的正确观念和开发技能,而这正是Jeffrey Richter先生作为优秀技术作家所擅长的地方。“庖丁解牛,鞭辟入里”,这恐怕是阐述软件技术的最高境界了。事实上,本书对VB.NET技术的剖析方式本身就是一种对VB的正名运动,我相信它会改变很多VB.NET开发人员的程序设计学习观念。

    需要说明的是,这里所言的底层有一个相对性,相对于VB.NET这门语言,我们说.NET框架就是它的底层;相对于使用VB.NET的应用人员,掌握.NET框架就算掌握了基本的底层。如果不看对象而无限推导,任何东西都可以被推导到“表层”。很简单,一个VB.NET编译器的开发人员不会认为.NET框架是底层,那么这本书对他而言也只是一本小学教材,谈不上价值高昂。所以,大家在阅读这篇译序和全书时,请务必记住本书的定位:VB.NET应用程序开发人员。另外,本书在VB.NET的语法语义方面着墨不多,这方面大家可以直接到网上参考微软MSDN文档中的Visual Basic .NET Language Specification,或者其他类似的书。

    有了好书,也要有好的阅读方法。就本书来讲,我强烈建议大家在阅读的同时多动手演练书中的代码,否则阅读的效果要大打折扣,因为很多技术细节和观念都需要通过代码来反复咀嚼才能很好地吸收。大家演练代码时,建议刚开始准备一个VBC.EXE(.NET框架SDK中附带的VB.NET编译器)和一个文本编辑器(比如记事本、UltraEdit、Emacs等),而避免使用Visual Studio.NET这样大型豪华的IDE。这样的方式对一些习惯了可视化编程的VB程序员可能有些陌生——但是,请相信我,这样的投入非常值得,从最微观的源代码和最原始的编译器工具开始对于建立正确的程序设计观念非常重要。等待熟练了之后,再使用Visual Studio.NET这样的IDE必然是游刃有余。另外,.NET框架SDK中附带的ILDasm.EXE也是一个很好的工具,经常使用它来观察程序集反汇编后的内容对于深入理解程序运行机制很有帮助。

    容我再稍费笔墨简单介绍一下本书的两位作者Jeffrey Richter 和 Francesco Balena,以及它的诞生过程。Jeffrey Richter先生是Windows/.NET程序设计领域享有盛誉的技术作家,著名技术刊物MSDN杂志 .NET专栏撰稿人。Jeffrey先生早在1999年就参与了微软.NET框架的开发与咨询工作,同期写就经典大作《Applied Microsoft.NET Framework Programming》。可惜这本书的描述语言为C#,虽然其讲述的技术内容对于所有的.NET编程语言都同等适用。不过幸运的是,时隔不久Jeffrey先生就应广大VB.NET社区的要求,并邀请VB领域的卓越技术作家 Francesco Balena先生(很多早期的VB程序员应该记得这位Visual Basic的“guru”)加盟,将《Applied Microsoft.NET Framework Programming》用VB.NET语言重写,本书便诞生于此。

    关于VB.NET和C#等其他.NET语言之间的选择问题,这里不打算做过多的纠缠,笔者只是想告诉大家这实在是个语言语法风格的“萝卜白菜”问题,完全不存在技术之争。如果您已经熟悉了VB语言的风格,那么转向VB.NET是最为快捷的一条道路。

    最后我要感谢所有对本书的翻译给予过帮助和支持的朋友。尤其是Jeffrey Richter和Francesco Balena两位优秀的技术作家,是他们卓越的技术能力和认真负责的态度成就了这本优秀之作。还有本书的两位技术审校陈铭和韩睿先生,他们的努力为本书增色不少。以及许许多多朋友、知名和不知名的网友,谢谢你们给我的鼓励和支持。

    我不奢望每一个Visual Basic程序员都能够立即热情地拥抱此书,但是我期望所有有志于在Visual Basic.NET领域耕耘的人不要错过它。