《Microsoft .NET框架程序设计(修订版)》译者序
——Jeffrey Richter精彩之作
●一本任何一个想了解.NET、学习.NET的读者都不可不读的开山之作
●全面剖析.NET框架机理,深度阐述.NET平台思想
●在亚马逊网站雄踞编程类图书销量排行榜榜首达14个月之久
●作者Jeffrey Richter,.NET著作领域中当之无愧的一面旗帜

探 微 知 著
  .NET平台推出至今已经整整3年了,3年来.NET从最初的市场噱头走进了绝大多数开发人员的视野,并成为很大一部分开发人员真实生活的一部分。我相信读者在阅读这篇译序时已经不再有".NET技术有什么优势"或者"我是否需要学习.NET技术"之类的疑问了。然而.NET技术浩如烟海,从底层的托管运行时,到五花八门的高级编程语言,从巨量的类库API,到丰富多彩的应用程序模型,各路技术尽数囊括,多种思想和盘托出。从哪里入手学,怎样学?

  是的,Jeffrey Richter先生在本书中给出了这一问题的答案,这就是.NET底层框架技术。

  我一直认为从微观入手、从底层入手是掌握软件技术的不二法门,我发现我的这种心得和Jeffrey先生在本书中的技术思路不谋而合。这也是我在翻译这部名著的高强度劳动中得以保持快乐的一个重要原因。在.NET平台中,.NET框架占据着核心的位置,它是整个.NET平台的关键支撑,是为众多高级语言(如C#、Managed C++、Visual Basic.NET等)和应用程序模型(如Windows窗体、ASP.NET Web窗体、XML Web 服务等)提供各种服务的重要基石。脱离.NET框架来谈.NET平台,难免不陷入空中楼阁的尴尬境地。实际上,在.NET平台中,任何一门编程语言提供的功能都只是.NET框架下一个子集的映射,具体的语言已经退居为一个语法表达的层次了。所以虽然本书的描述语言为C#,但是任何.NET语言下的开发人员都可以通过阅读本书来获得教益。除了编程语言外,各种类型的.NET应用程序在设计、开发、测试、部署、运行等诸多环节也和.NET框架密切相关。虽然本书并不涉及这些具体.NET应用程序模型的细节,但是如果没有对.NET框架的深刻把握,学习再多的.NET应用程序模型"开发技巧"都将只是徒劳--皮之不存,毛将焉附?因此,不管是学习Windows窗体、还是ASP.NET Web 窗体、抑或是XML Web 服务,我建议大家首先从.NET框架开始迈出坚实的一步--探微而知著,这也是Jeffrey先生写作本书的初衷。

  本书融合了Jeffrey Richter先生十几年的开发、顾问经验,对整个.NET框架技术进行了一次全面的检阅和酣畅淋漓的剖析。全书采用Jeffrey先生惯用的“于细微处入手,在平实中参透”的技术文笔将.NET框架中的各个技术要点一一呈现给读者。尤其是书中对程序集、元数据、值类型/引用类型(装箱/拆箱)、异常处理、垃圾收集等这些.NET核心技术的讲解,运思精深,鞭辟入里。对这些主题的掌握是理解整个.NET框架的关键,也是构建各种高效应用程序的必经路径。在对这些大部头的技术主题进行深入剖析的同时,书中还对读者在.NET应用程序开发实践中遇到的各种问题给予了很多有益的忠告和指导。此外,书中也不乏大量经典的可重用代码范例,如Dispose资源管理模式、事件设计模式、Equals的重写实现、对象池的设计等等,这些代码像珍珠一样遍布在本书的各个角落。实际上,笔者在日常的开发实践中就重用了其中许多代码。虽然本书是对.NET框架技术的一次全面的剖析,但它并不是对.NET框架技术事实的简单堆砌,而是带领读者去探索、去领悟、去构筑一个关于.NET平台核心技术的思想体系。书中每一章内容都值得读者反复阅读、细细品味,相信每一次重新阅读都会带给读者对.NET平台更为深刻的理解。

  虽然本书涵盖了大量艰深的技术,但是阅读起来却并不困难,这中间除了Jeffrey先生优美的技术文笔外,大量短小精悍的示例代码也功不可没。除非读者是久经沙场的软件开发老手,阅读本书只是出于消遣或者对Jeffrey先生的一份尊敬,否则笔者强烈建议大家在阅读的同时多通过动手演练这些代码来领悟这本名著的精髓。在阅读本书和进行代码演练时,建议大家到微软MSDN网站上下载一份.NET框架SDK,同时准备一个源代码编辑器(这方面有UltraEdit、SharpDevelop、Visual Studio.NET,以及C# Builder等)。在.NET框架SDK中,除了最常用的工具C#编译器(CSC.exe)外,建议读者把IL反汇编工具(ildasm.exe)也放在手边--实际上Jeffrey先生在本书中就有一个论断"如果你对IL反汇编工具显示的内容了解得越多,那么你对.NET框架的理解也会越深"。另外,读者也要多参阅.NET框架SDK中附带的类库文档。在源代码编辑器方面,如果读者使用的是比较高级的IDE(比如Visual Studio.NET),建议读者刚开始学习的时候避免使用其中的向导、自动代码生成等功能,而应该只把它们作为源代码编辑器来使用。因为不只我一个人发现刚开始学习程序设计就使用大型豪华IDE的高级功能往往会把学习者引入“神秘的、混沌的、并且不知所措的”状态中,除了打击读者的信心和积极性外,对学习掌握程序设计没有任何帮助。实际上从最简单的源代码编辑开始的学习者到后来往往最容易驾驭这些高级IDE工具的学习也有一个探微知著的过程。

  再来简单介绍一下本书的作者Jeffrey Richter先生。我相信阅读这篇译序的很多读者都比我更了解Jeffrey先生,以及他在.NET技术上所做的令人尊敬的贡献。Jeffrey Richter先生早在1999年.NET平台的整个开发工作正在进行时便受邀和微软一线的研发人员在一起讨论各种.NET技术问题,开展.NET技术的咨询工作。本书就诞生于这个过程。因此如果读者在本书中看到Jeffrey先生对.NET框架中大量技术要点来龙去脉的精辟讲解,各个优缺点的犀利分析,以及各种开发实践的忠告指导时,请不要感到任何的惊奇和突然--Jeffrey先生的确具有.NET技术的半官方背景。

  我相信对于.NET领域应该很快会有这样的说法--.NET程序员将会因为此书而分为两类,一类是读过《Applied Microsoft.NET Framework Programming》的,一类是没有读过《Applied Microsoft.NET Framework Programming》的。

  下面简单交代一下译本的几个问题。大家知道.NET中引入了许多新的术语,很多术语至今在开发界还不能做到耳熟能详,甚至时有混乱。因此,除了译本中附上的术语表外,书中正文在刚开始遇到这些术语时,一般都采用了中英并陈的方式,对于有些读者可能感到比较生疏的术语,还在多个地方进行了中英并陈,目的无非只有一个--方便读者阅读和理解。再一个问题是勘误。Jeffrey先生为本书的英文原版在微软出版社的网站上维护有一个勘误表,本书定稿时的最新勘误日期为2003年5月30日,这些勘误直接在译本中进行了修改。所以如果读者进行中英文对照阅读,会发现个别地方讲的不一致。这时读者首先应该去查阅英文版的勘误表。对于那些笔者发现的、但未在原书勘误中列出的错误(其中绝大多数都和Jeffrey先生进行了讨论),笔者采用添加译注的方式进行了说明。译本在出版之后也会长期维护一个勘误表。最后,本书采用了页页对译,书后的索引完全来自本书英文原版。但是由于有些地方添加了Jeffrey先生的勘误和笔者的译注,这使得页页对译很难在每一页中都得到严格的保证。因此读者偶尔会发现索引位置不匹配的问题,这时读者应该在索引页码的前后页查找。希望译本的这些做法能够提升读者的阅读体验。

  最后,我要感谢所有对本书的翻译给予过帮助和支持的朋友。我首先要感谢本书的原作者Jeffrey Richter先生,除了为本书带来大量的精彩华章外,Jeffrey先生对这本中译本也贡献颇多。在本书的翻译过程中,Jeffrey先生对我提出的大量不管是琐碎的、还是艰深的问题都给予了耐心的解答,这是这本书的翻译能够成功完成的重要保证。书中很多重要的译注都是我和Jeffrey先生交流切磋的结果,如果它们能够给读者的阅读和对.NET框架的理解带来帮助的话,请把这些功劳记在Jeffrey先生的名下。我还要特别感谢清华大学出版社的章忆文女士,是她促成了这次合作,读者才有机会看到这个译本。还有清华大学出版社的杨志娟女士等各位编辑,她们在这部名著的翻译、校对、排版、制图等各个环节上做了大量的工作,读者阅读本书时得到的各种美好体验与享受一定有她们的很多功劳。还有在本书翻译过程中给过我帮助、鼓励与支持的很多朋友和网友,请原谅我不能在这篇短序中一一列出他们的名字,我相信一个好的译本是对大家最好的答谢。

  我真诚地希望为这本书付出辛勤劳动的各方没有辜负大家的期望,希望各位读者朋友在美好的阅读享受之中能对.NET框架技术有一个彻底的、通透的理解。如果你阅读完本书后告诉我你对整个.NET框架技术有了一种豁然开朗的感觉,并大大提高了你的.NET应用程序设计和开发能力,甚至因此改变了你的程序生涯--这一点儿都不奇怪,这也是Jeffrey先生所有著作的特点--我将会感到十分的荣幸和愉快!如果你发现译本中有任何问题或不满意的地方,请不要吝啬你的CPU和Memory给我发信,我会非常感谢读者任何的批评与反馈,并及时做出更正与改进。谢谢!

  李建忠 2003/07 于上海浦东
  jzli@china.com (个人电子邮箱,欢迎读者的批评等阅读反馈)