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

编辑推荐
经典畅销书《Effective C#》的进阶篇,世界知名专家Bill Wagner倾力撰写,针对C# 7.0全面更新
紧贴C#语言的设计理念,既从正面阐释如何编写高效代码,又从反面入手指出容易出错之处,涵盖C#语言的各个方面
More Effective C#
50 Specific Ways to Improve Your C#
Second Edition
More Effective C#
改善C#代码的50个有效方法(原书第2版)
[ 美 ] 比尔 · 瓦格纳(Bill Wagner) 著
爱飞翔 译
内容简介
目录
前言
第1章 处理各种类型的数据 / 1
第1条:使用属性而不是可直接访问的数据成员 / 1
第2条:尽量采用隐式属性来表示可变的数据 / 7
第3条:尽量把值类型设计成不可变的类型 / 11
第4条:注意值类型与引用类型之间的区别 / 16
第5条:确保 0 可以当成值类型的有效状态使用 / 21
第6条:确保属性能够像数据那样运用 / 25
第7条:用元组来限制类型的作用范围 / 30
第8条:在匿名类型中定义局部函数 / 35
第9条:理解相等的不同概念及它们之间的关系 / 40
第10条:留意GetHashCode()方法的使用陷阱 / 49
第2章 API设计 / 57
第11条:不要在API中提供转换运算符 / 57
第12条:尽量用可选参数来取代方法重载 / 61
第13条:尽量缩减类型的可见范围 / 65
第14条:优先考虑定义并实现接口,而不是继承 / 69
第15条:理解接口方法与虚方法之间的区别 / 77
第16条:用Event模式来实现通知功能 / 82
前言
架构与部署方面的变化也要求C#开发者改变早前的编程习惯。拼装微服务(microservice)、构建分布式程序、分离算法与数据等做法,在当前的应用程序开发工作中已经很常见了。因此,C#语言也开始针对这些开发习惯做出调整。
笔者在安排本书第2版的内容时,考虑到了语言及开发者社区这两个方面的变化。本书不打算陈述语言的演变历史,而是着重讲解怎样用好当前的C#语言。与上一版相比,新版把那些与当前C#语言以及当前应用开发工作无关的内容都删掉了。新增的条目涵盖了语言与框架的新特性,以及众多开发者在用C#打造软件产品的过程中总结出来的经验。看过旧版 Effective C# 书系的读者稍后会发现,之前版本的《Effective C#》中有很多条目移到了这一版的《More Effective C#》中,此外,笔者还删除了旧版的许多条目。新版《Effective C#》与《More Effective C#》的内容是重新编排过的。本书收录的 50 条建议可以帮助你更高效地使用C#语言,从而成为更加专业的开发者。
本书假设你是使用C# 7来开发程序的,然而笔者并不会详细地讲到这一版C#语言所具备的每一种新特性。与 Effective 软件开发书系的其他作品类似,本书关注的也是怎样运用语言特性来解决日常工作中的实际问题。C# 7 中有一些新特性,可以实现出比旧式做法更为高效的新方案,本书尤其关注这些特性。大家在网上找到的某些解决办法可能是几年前的旧方案,针对这种情况,笔者会专门指出用新特性实现出的方案为什么比早前的那些办法要好。
你可以用基于Roslyn的分析器(analyzer)和代码修复程序(code fix)来判断某段 C# 代码有没有遵循书中所提到的某些建议。笔者把相关资源放在了 https://github.com/BillWagner/MoreEffectiveCSharpAnalyzers上。如果你有任何想法,或是打算给这份代码库提供新的内容,请点击该网页上的issue或pull request。
目标读者
本书适合以C#为首选编程语言的专业开发者阅读。你应该熟悉 C# 语言的写法及各项特性,并且能够熟练地运用 C# 语言的一般功能。书中不会再教你如何利用这些特性,而是要告诉你怎样把当前这一版 C# 语言所具备的特性正确地运用于日常开发工作中。
除了要熟悉C#本身的特性外,你还应该了解CLR(Common Language Runtime,公共语言运行时)与JIT(Just-In-Time,即时)编译器。
每章概述
当今世界,数据无处不在,但对待数据的方式却各有不同。面向对象的编程范式把数据与代码都当成类型及其职责的一部分。函数式的编程范式将方法视为数据。面向服务的编程范式则把数据与操纵数据的代码分隔开来。C#语言在演变的过程中把这些编程范式用到的习惯写法全都包括了进来,这就要求开发者在选择设计方式时必须多加考虑。第1章会告诉你怎样根据不同的编程范式来选用合适的写法。
编写程序在很大程度上是在设计API。使用API的人可以通过API看出API的设计者所规划的用法,还可以看出设计者是怎样理解其他开发者的需求和期望的。第 2 章介绍如何利用C#语言的众多特性来准确表达自己的设计思路,例如,怎样利用惰性初始化机制,怎样创建易于拼接的接口,以及怎样避免公有接口中的各种语言特性给人们带来困惑,等等。
基于任务的异步编程要求开发者采用一些新的写法,把这些基本的异步单元组合成完整的应用程序。掌握这些异步特性,有助于创建良好的异步操作 API,这些 API 要能够准确地反映出代码的执行方式,从而令调用者使用起来更加顺畅。第3章讲解怎样使用C#语言中基于任务的异步特性来创建合适的 API,以便准确地告诉调用方这个API会如何利用各种服务及资源。
第4章专门讲解异步编程中的一个领域:多线程并行执行。你会看到怎样利用PLINQ方便地拆解复杂的算法,从而令其能够运行在多个处理器核心及多个CPU上。
第5章讨论怎样把C#当成动态语言来使用。C#本身是强类型的静态类型语言,然而当今很多程序都在同时运用动态类型与静态类型这两种机制。C#一方面可以继续发挥静态类型的优势,另一方面又允许开发者在程序中同时运用动态编程的一些写法。第5章会讲解如何使用这些动态特性,以及怎样避免动态类型在整个程序中过于泛滥。
第6章会提出一些建议,告诉你怎样更好地与全世界的 C# 开发者交流。你可以通过各种办法为C#语言的发展做出贡献,并帮助大家把这门日常语言打造得更加优秀。
代码约定
在书中展示代码需要兼顾版面与清晰度。笔者尽量将范例代码写得较为精简,使其能够专注于该段代码所要讲解的问题,这就意味着类或方法中与本问题无关的部分可能会省略,而且错误恢复代码可能也不会写出,以求节省篇幅。公有方法应该验证调用方所传入的参数及其他输入数据,不过,由于篇幅的限制,这些内容同样会省略。此外,复杂的算法通常会对方法调用做出验证并编写try/finally结构,这些内容也会因篇幅过大而被略去。
笔者假设你能够从代码中看出它用到的几个常见命名空间。你可以认为每段范例代码都采用了下面几条using语句:
提供反馈
笔者尽量保证书中的文字与代码准确,这些内容也经过了其他人审阅,然而其中或许还是会有一些错误。如果你发现了错误,那么请发送邮件到 bill@thebillwagner.com,或通过 Twitter 号 @billwagner 联系我。本书的勘误表发布在http://thebillwagner.com/Resources/More EffectiveCS上。书中有很多条目都是笔者通过电子邮件或 Twitter 与其他 C# 开发者讨论时想出来的。如果对这些条目所给出的建议有想法或评论,也请联系我。更一般的话题则可以在博客http://thebillwagner.com/blog上讨论。
媒体评论
Wagner在《Effective C#》的3 个版本中的清晰解释、专家技巧和真实代码用例,已经被成千上万个开发者证实是非常宝贵的。本书原书第2版在第1版的基础上做了大幅调整。它与《Effective C#》的 3 个版本一样,也以清晰而务实的风格,系统地呈现出了一套贴近当前 C# 语言的技巧与范例。书中给出的建议都是行之有效的,它们会告诉你怎样改用 C# 7.0 的新特性来更有效率地完成常见任务。
作为C#标准委员会的重要成员,本书作者Wagner利用他无与伦比的 C#开发经验,讲述了如何使用C#通过面向对象、函数和面向服务来管理数据,如何将设计理念传达给用户和其他开发者,以及如何利用强大的异步和动态编程技巧。
■ 使用属性而不是可直接访问的数据成员(第 1 条)
■ 注意值类型与引用类型之间的区别(第 4 条)
■ 理解相等的不同概念及它们之间的关系(第 9 条)
■ 不要在 API 里面提供转换运算符(第 11 条)
■ 理解接口方法与虚方法之间的区别(第 15 条)
■ 不要重载基类中定义的方法(第 19 条)
■ 尽量把重载方法创建得清晰、简洁而完备(第 22 条)
■ 在迭代器与异步方法中定义局部函数,以便尽早地报错(第 26 条)
■ 使用异步方法执行异步工作(第 27 条)
■ 使用异步方法以避免线程分配和上下文切换(第 30 条)
■ 编写并行算法时要考虑异常状况(第 36 条)
■ 优先使用线程池而不是创建新的线程(第 37 条)
■ 考虑使用 BackgroundWorker 在线程之间通信(第 38 条)
■ 尽量缩减锁定范围(第 41 条)
■ 了解动态编程的优点及缺点(第 43 条)
■ 学会正确使用 Expression API(第 46 条)
■ 尽量减少公有 API中的动态对象(第 47 条)