2
译者序
从事软件开发的人,都是耐得住寂寞的人。Jeffery 不仅耐得住寂寞,还在自己的专业领域取得了很高
的造诣。取得了很高的造诣还不说,他还愿意将自己的所得与大家分享。愿意和大家分享还不说,他还非
常实诚,真心想把自己的全部知识都交待给读者。字里行间,全是殷殷叮嘱。无浮夸之文字,倾心血而写
就,近十年之所悟,尽展现于本书。
读完这本书,你的心灵会受到巨大的震撼。原因很简单,以前许多似懂非懂的关键概念,现在都变得
清晰明了;以前自以为是的一些做法,现在都得到彻底纠正;以前艰苦摸索的一些编程技巧,现在变得就
像 1+1 一样简单。
Jeffery 最擅长的就是把最基本的东西讲清楚。你以前或许知道 1+1 等于 2,但他会把 1+1 为什么等于 2
讲得明明白白。最终你会有一种顿悟的感觉,然后自动地就会知道 1+2 等于几,2+2 等于几。不需要再去
翻阅其他教科书查询结果。
如果不出意外,这当是 Jeffery 的最后一本著作。原因很简单,他付出了实在太多。为了保证这本书(以
及他的其他许多著作)的含金量,他在写作的时候非常投入,而且每一句话,每一个知识点的组织,他都
会做到尽善尽美。也许你也曾经有过这样的体验,那就在专心做一些事情的时候,对身边的发生的事情反
应可能非常迟钝。因此,必然有可能冷落了家人,或者耽误了自己的其他一些事情。
本书基于 CLR via C# 2
nd
Edition(框架设计第 2 版),在保持上一版精华内容的同时,进行了大量修订,
并添加了大量和 C# 4.0 的新特性以及线程处理有关的内容。翻译这一版的过程中,我对上一版也进行了勘
误,其中有许多都是热心读者提交的。在此要对他们表示感谢!
一本没有后期维护的书,不算是一本好书。即使如本书原版,也维护了一份很长的勘误表,我本人也
为其贡献良多。本书中文版将延续我一直以来坚持的风格,建立专门的页面对它进行维护,以提供资源下
载和勘误等服务。请大家继续前往我的博客(http://transbot.blog.163.com),发表关于本书的意见和建议。
翻译过程中,感谢我的家人和朋友的诸多关怀和帮助,尤其要感谢我的乖女儿周子衿。这个学期,对
她来说至关重要!
最后,如同往常一样,我要说所有的功劳都要归于作者,所有的错误都要归于译者。欢迎大家批评指
正。
——周靖@北京
3
序言
刚开始,当 Jeff 要我给他的新书作序时,我还觉得挺高兴!我想,他肯定是尊重我。但我错了。女士们,
这是我们因为想当然而常犯的错误之一——相信我,他并不是尊重你。在他的候选序言作者列表中,我排
在大概是第 14 位吧。他最后找上我,完全是迫不得已嘛。显然,其他候选人(比尔·盖茨、史蒂夫·鲍尔
默、凯瑟琳·泽塔琼斯„„)对他都不是特别感冒。不过还好,他至少带我出去吃了一顿大餐。
但是,关于这本书,没人知道得比我更多了。我是说,泽塔琼斯也许会教你如何在路上补妆,但我知道关
于反射和异常的所有事情,我还知道 C#语言的更新,因为他这几年说得最多的就是它。这是我们家餐桌上
的标准对话!其他人会谈论天气或者他们在饮水机旁边听到其他事儿,但我们谈论的是.NET。甚至我们 6
岁的儿子 Aidan,也会问 Jeff 关于书的事情。不过大多数时候,他是问爸爸什么时候写完了能和他玩一些“cool”
的游戏。Grant(2 岁)还不会说话,但他说的第一个词极有可能是“Sequential”。
如果你想知道这一切是如何开始的,我可以大概地讲给你听。大概 10 年前, Jeff 去微软参加了一次“秘
密会议”。微软向一帮行业专家(是真正的专家喔,要不然怎么会有这本书呢?相信我,这本书体现的绝不
是 Jeff 大学时候的水平)揭示了 COM 的下一代,即.NET。那天晚上在床上(咳,我们俩在床上讨论的就是
这种话题),他给我讲了 COM 之死。此后他就着迷了。是真的神魂颠倒。那段时间,他成天泡在微软雷蒙
德园区 42 号楼,希望深入了解这个令人着迷的.NET。他和.NET 的热恋至今还没有结束,这本书便是铁证!
Jeff 跟我讲了好多年的线程处理。他真的很喜欢这个主题。有一次,在新奥尔良,我们俩手牵着手散了两个
小时的步。一路上,他一直在说他有好多内容可以写一本有关线程处理的书,甚至连名字都想好了,叫什
么《线程处理的艺术》。人们对 Windows 线程处理的误解是多么地深。所思、所想、所说,全部都是线程。
它们都去了哪里?既然都没有计划,为何还要创建呢?这些问题在 Jeff 脑海中盘旋,占据着 Jeff 的全部身
心,成了他更深层次的生存意义。最后,他将自己的思考所得全都写入这本书中。是的,没有丝毫保留!
相信我,朋友,如果你想知道线程处理,Jeff 绝对是最佳人选,没有人比他了解得更多,没有人有他研究得
更多。耗费了他生命中很多宝贵时间(这些时间是他捡不回来的)的那些成果就摆在你的面前,任你任意
使用。请读一读这本书吧!然后给他写封电子邮件,谈谈书中这些知识是如何改变您的一生的。否则,他
将不过是众多可悲的作家中的一个,没有任何价值或成就地结束生命,一杯接一杯地喝着低糖汽水了却残
生。
本书的这一版甚至包括了关于运行时序列化器的全新的一章。实践证明,这不是给孩子们的一款新的早餐
食品。当我发现它更像是和计算机有关,而不是我食品清单上的东东时,我立即非常气愤地把它赶出我的
清单了。嗯,所以我不知道这一章真的讲的是什么,但它的确包含在这一版中,而你应该读一读它(嗯,
就着一杯牛奶)。
1
我希望他已经在理论上讨论好了垃圾收集,可以实际着手我们家的垃圾收集,然后把它们带去马路边了。
对于一个如此认真的人,这件事情怎么就如此之难?
朋友们,这是 Jeffrey Richter 的鸿篇巨制。到此为止。以后不会再写书了。当然,每次他写完一本书,我们
都这样说,但这一次,我们是认真的。所以,在写过大约 13 本书之后,这将是 Jeff 的收官之作,也是他的
巅峰之作。大家请注意了,数量有限,欲购从速。机不可失,时不再来喔。(听起来是不是有点儿像电视购
物频道里奸商们的吆喝?)
1
serializer 和早餐食物 cereal 的读音相近,故有此误解。——译注
4
唉,终于可以回到我们的现实生活了,我们可以讨论很多重要的事情,比如孩子们今天又弄坏了什么,该
谁给孩子换尿片了,诸如此类的东西。
Kristin Trace (Jeffrey 的老婆)
2009 年 11 月 24
Richter 家的标准家庭早餐
5
前言
1999 年 10 月,Microsoft 的一些人首次向我展示了 Microsoft .NET Framework、公共语言运行时(CLR)
和 C#编程语言。看到所有这一切时,我震惊了,我知道我写软件的方式要发生非常大的变化了。他们请我
为团队做一些顾问工作,我当即就同意了。刚开始,我以为.NET Framework 是 Win32 API 和 COM 上的一个
抽象层。然而,随着我投入越来越多的时间研究它,我意识到它是一个更宏伟的项目。在某种程度上,它
是它自己的操作系统。它有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理机
制,自己的应用程序隔离边界(AppDomains)、自己的线程处理模型等。本书解释了所有这些主题,帮助
你为这个平台高效地设计和实现软件应用程序及组件。
我花费了大量时间专注于线程处理、并发执行、并行结构、同步等方面的研究。如今,随着多核计算
机越来越普遍,这些主题的重要性日益凸显。几年前,我决定专门写一本讲线程处理的书。然而,事情一
件接着一件,我的想法一直没有实现。当我有时间修订本书的时候,我决定将所有线程处理的内容集成到
其中。所以,本书除了全面讨论.NET Framework 的 CLR 和 C#编程语言,还嵌入了我的关于线程处理的书(第
Ⅴ部分“线程处理”)。
我是 2009 年 10 月开始写作本书的,距离第一次接触.NET Framework 和 C#正好十年。十几年来, 我
作为 Microsoft 的一名顾问,开发过各种各样的应用程序,为.NET Framework 本身也贡献良多。作为我自己
的公司(Wintellect,http://Wintellect.com)的一名合伙人,我还要为大量客户工作,帮他们设计软件、调
试软件、优化软件和解决他们使用.NET Framework 时遇到的问题。正是因为有了这些资历,所以我才知道
人们在使用.NET Framework 进行高效率编程时,可能会在什么地方遇到麻烦。贯穿本书的所有主题,你都
会看到我的这些经验之谈。
本书面向的读者
本书旨在解释如何为.NET Framework 开发应用程序和可重用的类。具体地说,我要解释 CLR 的工作原
理及其提供的功能。另外,我还要讨论 Framework Class Library(FCL)的各个部分。没有一本书能完整地解
释 FCL——其中包含数以千计的类型,而且这个数字正在以惊人的速度增长。所以,我准备将重点放在每个
开发人员都需要注意的核心类型上面。另外,虽然本书不专门讲 Windows 窗体、Windows Presentation
Foundation(WPF)、 Silverlight、XML Web 服务、Web 窗体等,但本书描述的技术适用于所有这些应用程序
类型。
本书是围绕 Microsoft Visual Studio 2010,.NET Framework 4.0 和 C# 4.0 展开的。由于 Microsoft 在发布
这些技术的新版本时,会试图保持很大程度的向后兼容性,所以本书描述的许多内容也适用于以前的版本。
所有示例代码都用 C#编程语言来演示各种功能的行为。但是,由于 CLR 可由许多编程语言使用,所以本书
内容还是很适合非 C#程序员的。
注意:本书代码可从 Wintellect 的网站下载(http://Wintellect.com)
2
。在本书某些部分,我描述了我自己
的 Power Threading Library 中的类。 这个库是免费的,也可从 Wintellect 的网站下载。
Microsoft 提供了 CLR 的几个版本。有桌面/服务器版本,在 Microsoft Windows 的 32 位(x86)和 64 位
(x64/IA64 )版本上运行。还有 Silverlight 版本,它是用和.NET Framework CLR 的桌面/服务器版一样的源
代码库来生成的。所以,本书描述的一切也适用于生成 Silverlight 应用程序,只是 Silverlight 加载程序集的
方式有一些区别。.NET Framework 有一个“简化”版本,称为.NET Compact Framework,它适合 Windows
手机和运行 Windows CE 操作系统的其他设备。本书许多内容也适合用于为.NET Compact Framework 开发应
2
译者博客 http://transbot.blog.163.com 也提供了资源下载和勘误等维护服务。——译注