Preface 前 言
本书第1版于2004年出版,到了2016年,C#开发社群的情况已经有了很大的变化。使用这门语言编写程序的人越来越多,很多人现在都把C#当作首选的工作语言,并且不会再按照使用其他语言时所形成的那些习惯来使用这门语言。此外,C# 开发者所具备的经验各不相同,从刚毕业的学生到拥有数十年经验的专业开发者,都有人在用C#写程序,而且 C# 所支持的平台也比原来更加广泛。你可以用它架设服务器或制作网站,也可以为各种操作系统开发桌面版本或移动版本的应用程序。
这次升级的第3版既考虑到C#语言本身的变化,也考虑到使用这门语言的人(或者说 C# 开发社群)所发生的变化。笔者并不打算讲述C#语言的演变历程,而是关注怎样用好当前版本的 C# 语言。旧版的某些条目已经与当今的 C# 语言或 C# 应用程序脱节了,这些内容不会出现在新版中。新版中会添加一些条目,以讲述 C# 语言的新特性与 .NET 框架的新功能,这些内容是从软件产品的开发过程中提炼出来的,许多C#开发者采用这些特性开发了多个版本的软件。看过《More Effective C#》第1版的读者稍后可能会发现,那本书里的某些内容已经移到了本书中。在本书第3版中,笔者重新编排《More Effective C#》的内容,删除了原有的许多条目,以便在那本书的第2版中添加其他一些条目。总之,这本书里的 50 个条目都是一些编程建议,可以帮助你更为高效地使用 C# 语言,从而成为更加专业的开发者。
本书预设的语境是 6.0 版本的 C#,然而笔者并不会把该版本的功能全都拿出来讲。与Effective Software Development系列的其他书一样,这本书所关注的也是怎样用语言特性来解决日常工作中可能遇到的问题,并提供实用的建议。在 C# 6.0 版的这些特性中,笔者会特意挑出一些来讲,因为其中的某些特性能够使开发者以更好的方式来编写常用的代码。网上搜到的写法可能是针对许多年前的C#版本而写的,有了新版C#所引入的特性之后,开发者就可以用更好的写法来完成那些任务了,对于此类情况,笔者会专门指出。
书中的很多建议都可以用Roslyn平台的Analyzer及Code Fix加以体现,从而验证开发者所写的代码是否符合这些建议。笔者把相关的Analyzer放在了这里:https://github.com/BillWagner/EffectiveCSharpAnalyzers。你可以提交 issue,以表达自己的看法,或是发送 pull request为项目添加新的内容。
读者对象本书面向的是那些使用 C# 来完成日常工作的职业开发者。由于本书假设读者已经熟悉了 C# 的语法及语言特性,因此,并不会按部就班地讲解这些特性,而是会告诉你应该怎样把当前这一版 C# 语言所拥有的各种特性融入日常的开发工作中。
除了要熟悉语言本身的特性之外,还应该对 CLR(Common Language Runtime,公共语言运行时)及 JIT(Just-In-Time,即时)编译器有所了解。
内容提要有一些语言结构是每次写 C# 程序时几乎都会用到的,这些常见的写法出现在本书的第1章中,它们是开发者手头必备的工具,无论创建什么样的类型与算法,都离不开这些工具。
尽管 C# 程序运行在托管环境中,但并不是说开发者什么事情都不用操心。要想令程序的性能满足需求,就必须编写出能够与托管环境相协调的代码,这不是单靠性能测试与性能调整就可以实现的。因此,第2章会介绍一些设计习惯,告诉你应该怎样把代码写得与托管环境相协调。以良好的设计风格为基础,可以更加有效地优化细节问题。
自C# 2.0以来所引入的很多新技术都是以泛型为依托的。第3章讲解怎样用泛型取代System.Object以及强制类型转换,然后,笔者会讨论一些高级技术,例如约束、泛型特化、方法约束以及向后兼容等。读完本章之后,你会学到很多泛型技巧,从而能够更加顺畅地表达出自己的设计思路。
第4章会讲解 LINQ、查询语法以及与之相关的语言特性。你会了解到在哪些情况下应该运用扩展方法把协定与实现相分离,还会学到应该怎样有效地使用闭包以及如何编写匿名类型。此外,笔者还会解释编译器怎样把查询关键字映射成方法调用、如何区分委托与表达式树以及必要时怎样在二者之间转换,以及如何对查询做出转义以获取纯量形式的结果。
第 5 章会指引你把 C# 程序中的异常与错误处理好。笔者要讲解怎样确保程序中的错误能够得到适当的汇报,以及如何令程序的状态在出错之后依然保持稳定,甚至与出错之前一样。此外,你还会学到怎样给使用代码的人提供便利,令他们能够更加顺畅地调试你所编写的程序。
代码约定要想把范例代码印在书中,就必须在保持清晰的前提下顾及篇幅。笔者尽量把代码写得简短,以凸显其中最关键的部分,并把类或方法中的其他部分省掉。有时为了节省篇幅,还会把错误恢复代码也省掉。public 方法自然应该验证其参数以及外界输入给它的数据,但考虑到篇幅,笔者通常会把这些代码去掉。此外,很多复杂的算法还会对方法调用做出核查,而且会包含try/finally子句,这些代码也因同样的理由而删去。
常见的命名空间就不再写出了。你可以认为每一份范例代码前面都写有下面几条 using语句:
提供反馈意见笔者与本书的审阅者都尽力确保书中的内容正确无误,尽管如此,本书与范例代码里面可能还是会有一些错误,读者如果发现某个地方写错了,请发邮件至
[email protected],或通过Twitter号码@billwagner联系我。勘误表将会发布至http://thebillwagner.com/Resources/Effectivecs。书中的很多条目是笔者在与其他C#开发者通过电子邮件及Twitter讨论之后写出的,读者若对这些编程建议有疑问或意见,也请联系笔者。更为一般的话题可参见笔者博客:http://thebillwagner.com/blog。
致谢我要感谢为本书做出贡献的诸多人士。很荣幸能在这些年里与大家一起使用 C# 语言。C# Insiders 邮件列表中的每位朋友(无论身处 Microsoft 公司之内或之外)都为本书提供了创意,并且愿意与我交流,使我能把这本书写得更好。
必须特别感谢下面这几位 C# 开发者:Jon Skeet、Dustin Campbell、Kevin Pilch-Bisson、Jared Parsons、Scott Allen 以及 Mads Torgersen。感谢你们与我沟通、向我提供意见,并将其转变为具体的成果。这一版的很多新想法都是根据诸位的意见而形成的。
这一版的技术评审团队同样很出色。Jason Bock、Mark Michaelis 与 Eric Lippert 仔细阅读了文稿与范例代码,以确保读者能拿到一本优质的书籍。他们的水平相当高,不仅全面而彻底地审阅了本书,而且还提供了一些建议,帮助我把其中的很多话题解释得更为清楚。
我与Addison-Wesley出版社的编辑团队合作得相当愉快。Trina Macdonald 是一位优秀的编辑,总能督促我把书写好。Mark Renfro 与 Olivia Basegio 是她的得力帮手,我依靠他们完成了很多工作,这本书的定稿能够达到现在这样的质量,与他们的努力有很大关系,从头到尾的每一页内容都是如此。Curt Johnson 致力于发售这本技术图书,无论是哪种格式都有他的一份心力在里面。
感谢Scott Meyers再度将本书收入 Effective 书系,他阅读了整部文稿,并提出了一些改进建议。Meyers 虽然不是做 C# 的,但却有着丰富的软件开发经验,能够把文稿中没有解释清楚的地方找出来,而且能指出其中有哪些技巧还不足以总结成心得推荐给大家使用。他的意见,给我带来了很大的帮助。
感谢家人留出时间,令我可以写完这本书。我花了很长时间撰写书稿并制作范例代码,妻子 Marlene 总是给予我支持。有她的鼓励,我才能把这本书和其他的书写好。