(特价书)Effective C#:改善C#代码的50个有效方法(原书第3版)
紧贴C#语言的设计理念,既从正面阐释如何编写代码,又从反面入手指出容易出错之处,涵盖C#语言的各个方面
基本信息
- 作者: (美)比尔·瓦格纳(Bill Wagner)
- 译者: 爱飞翔
- 丛书名: Effective系列丛书
- 出版社:机械工业出版社
- ISBN:9787111597193
- 上架时间:2018-6-25
- 出版日期:2018 年5月
- 开本:16开
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > C#

编辑推荐
经典畅销书全新升级,世界知名C#专家Bill Wagner倾力撰写,C#程序员必备参考
紧贴C#语言的设计理念,既从正面阐释如何编写高效代码,又从反面入手指出容易出错之处,涵盖C#语言的各个方面
Effective C#
50 Specific Ways to Improve Your C#
Third Edition
Effective C#
改善C#代码的50个有效方法(原书第3版)
[ 美 ] 比尔 · 瓦格纳(Bill Wagner) 著
爱飞翔 译
内容简介
作译者
目录
译者序
前言
第1章 C#语言的编程习惯1
第1条:优先使用隐式类型的局部变量1
第2条:考虑用readonly代替const8
第3条:优先考虑is或as运算符,尽量少用强制类型转换12
第4条:用内插字符串取代string.Format()20
第5条:用FormattableString取代专门为特定区域而写的字符串24
第6条:不要用表示符号名称的硬字符串来调用 API26
第7条:用委托表示回调28
第8条:用null条件运算符调用事件处理程序31
第9条:尽量避免装箱与取消装箱这两种操作34
第10条:只有在应对新版基类与现有子类之间的冲突时才应该使用 new修饰符38
第2章 .NET的资源管理42
第11条:理解并善用 .NET的资源管理机制42
第12条:声明字段时,尽量直接为其设定初始值47
第13条:用适当的方式初始化类中的静态成员50
第14条:尽量删减重复的初始化逻辑52
第15条:不要创建无谓的对象60
译者序
与该书系的其他作品一样,这本《Effective C#》也表现出了这种风格。作者把C# 语言在各个方面的用法系统地整理出来。除了从正面讲述应该怎样编写高效的代码之外,还从反面入手,告诉大家C#及.NET中都有哪些可能出错或遭到误用的地方。作者不仅指出了问题,而且详细解释了这些问题的产生原理及应对方案。考虑到作者在.NET及 C#开发界的经历以及在 Microsoft 公司与其他组织中所从事的工作,这些讲解是很有分量的。
虽说这本书是整个Effective系列的一部分,但并没有单纯按照某个固定的套路去复刻,而是有着自身的创见。书中的很多建议都是从系统自带的类库中寻找灵感,并提倡将相关的设计模式运用到自己所要编写的类库或应用程序上,这或许能够提醒大家:编写程序库与编写客户代码时所用的思路未必是毫无关联的,而是有可能在某种意义上是相通的。作者针对程序库的设计者所提出的一些建议其实同样适用于客户端的开发者,反过来说,客户端的开发者调用程序库的方式也可以给库的设计者提供参考,提醒他们多考虑用户的实际用法,而不是一味固守某种教条。
在具体实现层面上,作者的思路同样开阔。他没有直接重复业界已有的编程习惯,而是辨析了这些写法的优点及缺点,并建议大家要在适当的情境中合理地加以运用,而不能过于盲目,同时还告诉读者,应该理解并熟悉 C# 语言所添加的新特性,以改掉从前那些不好的或已经过时的习惯。
总之,书中的50条建议都是紧贴着C#语言自身的设计理念而写的,在介绍新特性以及与其他语言相对比的过程中,也充分考虑到了程序库设计者与客户端开发者实际使用该语言的方式。这种在沿承中有所创新的做法,令语言本身及其用户都显得更有活力。
翻译本书的过程中,我得到了机械工业出版社华章公司诸位编辑与工作人员的帮助,在此深表感谢。
书中的术语参考了Microsoft的语言门户网站(www.microsoft.com/Language/zh-cn/Search.aspx)以及其他一些技术文章,书末附有“中英文词汇对照表”,以供查阅。
由于译者水平有限,错误与疏漏之处,请大家发邮件至eastarstormlee@gmail.com,或访问github.com/jeffreybaoshenlee/ecs3-errata/issues留言,给我以批评和指教。
爱飞翔
前言
这次升级的第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语句:
提供反馈意见
笔者与本书的审阅者都尽力确保书中的内容正确无误,尽管如此,本书与范例代码里面可能还是会有一些错误,读者如果发现某个地方写错了,请发邮件至bill@thebillwagner.com,或通过Twitter号码@billwagner联系我。勘误表将会发布至http://thebillwagner.com/Resources/Effectivecs。书中的很多条目是笔者在与其他C#开发者通过电子邮件及Twitter讨论之后写出的,读者若对这些编程建议有疑问或意见,也请联系笔者。更为一般的话题可参见笔者博客:http://thebillwagner.com/blog。
致谢
我要感谢为本书做出贡献的诸多人士。很荣幸能在这些年里与大家一起使用 C# 语言。C# Insiders 邮件列表中的每位朋友(无论身处 Microsoft 公司之内或之外)都为本书提供了创意,并且愿意与我交流,使我能把这本书写得更好。
媒体评论
“如果你和我一样把这本书看完,那么你就可以收集到很多 C# 语言的技巧,这些技巧能够令你更好地发挥自身能力,从而成为更加专业的开发者。在综述 C# 语言技巧的书里面,这本书很可能是最棒的,Bill Wagner 这次所写的新版《Effective C#》依然是杰作,没有令我失望。”——Bill Craun, Ambassador Solutions首席顾问
“想要构建高性能与高扩展性应用程序的开发者都应该阅读本书。这本书写得很好,作者 Bill把相当复杂的问题拆分成读者容易理解、容易吸收的小知识点。”——Josh Holmes ,微软架构布道师
“这本书依然很好,浓缩了许多对 C# 开发者极为有用的技巧。每天学习一项技巧,50天之后,C# 开发水平就会大有长进。”——Claudio Lassala ,EPS Software/CODE Magazine首席开发者
“这本书包含很多 C# 语言的知识以及作者对这门语言的理解。Bill 揭示了 .NET 运行时平台的底层机制,使读者能够明白构建于该平台上的 C# 代码是如何运行的。此外,他还告诉大家应该怎样写出清晰流畅、易于理解的代码。书中包含丰富的技巧与深刻的见解……每一位 C# 开发者都应该阅读。”——Brian Noyes, IDesign Inc.(www.idesign.net)首席架构师
“这是一本每一位 C# 开发者必读的书,里面给出了很多实用的编程建议。”——Shawn Wildermuth ,微软MVP (C#)、写作者、培训者、演讲者
“Bill Wagner 在这本书中切实地阐述了怎样使用 C# 语言中最为重要的特性。他具备丰富的知识与流畅的表达能力,可以清楚地讲解 C# 语言的新功能,使读者明白怎样运用这些功能写出精练而易于维护的代码。”——Charlie Calvert,微软C#社区项目经理
书摘
这段代码采用null条件运算符(也就是?.)安全地调用事件处理程序。该运算符首先判断其左侧的内容,如果发现这个值不是null,那就执行右侧的内容。反之,若为null,则跳过该语句,直接执行下一条语句。
从语义上来看,这与早前的if结构类似,但区别在于?.运算符左侧的内容只会计算一次。
由于C#语言不允许?.运算符右侧直接出现一对括号,因此,必须用Invoke方法去触发事件。每定义一种委托或事件,编译器就会为此生成类型安全的Invoke()方法,这意味着,通过调用Invoke方法来触发事件,其效果与早前那种写法是完全相同的。这段代码可以安全地运行在多线程环境下,而且篇幅更为短小。因为只有一行代码,所以根本不用专门创建辅助方法,那样反而会扰乱类的设计。只用一行代码就能触发事件,这正是我们想要的效果。
旧的习惯固然很难改掉,但对于写了很多年.NET程序的人来说,还是应该努力培养新的习惯才对。早前那种写法可能已经用在你们公司目前的代码中了,要想把那些地方改成新的写法,开发团队可能要做出很大的转变。如果你在触发事件的时候头一次碰到NullReferenceException问题,然后上网求助,那么会搜索到很多推荐旧式写法的文章,那些经验是根据十几年前的情况而总结的。
有了这种简单而清晰的新写法之后,原来的老习惯就需要改一改了。以后在触发事件的时候,都应该采用这种写法。
……