首页>参考读物>计算机科学与技术>软件与程序设计

Effective C#:改善C#代码的50个有效方法(原书第3版)
作者 : [美] 比尔·瓦格纳(Bill Wagner) 著
译者 : 爱飞翔 译
丛书名 : Effective系列丛书
出版日期 : 2018-05-14
ISBN : 978-7-111-59719-3
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 265
开本 : 16
原书名 : Effective C#: 50 Specific Ways to Improve Your C#, Third Edition
原出版社: Pearson Education Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

在本书中,世界知名的 .NET 专家 Bill Wagner 先生给出了 50 条建议,告诉你怎样充分利用 C# 6.0 所具备的特性来编写健壮而高效的代码。这些建议反映了 C# 开发界的新进展,也令人体会到C# 这门语言已经越来越成熟了。除了提出了许多种改善代码品质的新方式,例如怎样发挥泛型的优势之外,本书还针对 LINQ 给出了很多条建议。

图书特色

经典畅销书全新升级,世界知名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版于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语句:

提供反馈意见
笔者与本书的审阅者都尽力确保书中的内容正确无误,尽管如此,本书与范例代码里面可能还是会有一些错误,读者如果发现某个地方写错了,请发邮件至bill@thebillwagner.com,或通过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 总是给予我支持。有她的鼓励,我才能把这本书和其他的书写好。

上架指导

计算机\程序设计

封底文字

“要想成为高效率的 .NET 开发者,就必须透彻地理解自己所选的编程语言。Wagner 先生的这本书通过合理的论证,提出了一些见解,能够帮助读者更为透彻地了解 C# 语言。无论是新手还是具备数年经验的人,都可以从这本书中学到新的知识。”

——Jason Bock,Magenic首席顾问

“如果你和我一样把这本书看完,那么你就可以收集到很多 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#社区项目经理

译者序

自经典畅销书《Effective C++》面世以来,Effective图书系列成了软件开发界的传统图书。很多语言都有对应的Effective书籍,这些书会把该语言中的中、高级技巧按照其所属门类系统地组织起来,使这些技巧既能自成一体,又能与同一门类中的其他技巧相互联系,从而形成一套知识体系。有了这样的体系,读者就可以把工作与学习中所总结的心得以及所联想到的思路安排进来,从而清晰地感知它们在整个体系中所处的位置。
与该书系的其他作品一样,这本《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留言,给我以批评和指教。

爱飞翔

图书目录

本书赞誉
译者序
前言
第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
第16条:绝对不要在构造函数里面调用虚函数64
第17条:实现标准的dispose 模式67
第3章 合理地运用泛型74
第18条:只定义刚好够用的约束条件76
第19条:通过运行期类型检查实现特定的泛型算法82
第20条:通过IComparable及IComparer定义顺序关系88
第21条:创建泛型类时,总是应该给实现了IDisposable的类型参数提供支持95
第22条:考虑支持泛型协变与逆变98
第23条:用委托要求类型参数必须提供某种方法104
第24条:如果有泛型方法,就不要
再创建针对基类或接口的
重载版本110
第25条:如果不需要把类型参数所
表示的对象设为实例字段,
那么应该优先考虑创建泛
型方法,而不是泛型类114
第26条:实现泛型接口的同时,还
应该实现非泛型接口118
第27条:只把必备的契约定义在接
口中,把其他功能留给扩
展方法去实现124
第28条:考虑通过扩展方法增强已构造类型的功能128
第4章 合理地运用LINQ131
第29条:优先考虑提供迭代器方法,而不要返回集合131
第30条:优先考虑通过查询语句来编写代码,而不要使用循环语句137
第31条:把针对序列的API设计得更加易于拼接142
第32条:将迭代逻辑与操作、谓词及函数解耦149
第33条:等真正用到序列中的元素时再去生成153
第34条:考虑通过函数参数来放松耦合关系155
第35条:绝对不要重载扩展方法162
第36条:理解查询表达式与方法调用之间的映射关系165
第37条:尽量采用惰性求值的方式来查询,而不要及早求值177
第38条:考虑用lambda表达式来代替方法182
第39条:不要在Func与Action中抛出异常186
第40条:掌握尽早执行与延迟执行之间的区别188
第41条:不要把开销较大的资源捕获到闭包中193
第42条:注意IEnumerable与IQueryable形式的数据源之间的区别206
第43条:用Single()及First()来明确地验证你对查询结果所做的假设211
第44条:不要修改绑定变量214
第5章 合理地运用异常220
第45条:考虑在方法约定遭到违背时抛出异常220
第46条:利用using与try/finally来清理资源224
第47条:专门针对应用程序创建异常231
第48条:优先考虑做出强异常保证237
第49条:考虑用异常筛选器来改写先捕获异常再重新抛出的逻辑244
第50条:合理利用异常筛选器的副作用来实现某些效果248
中英文词汇对照表252

教学资源推荐
作者: [美]梁勇(Y.Daniel Liang) 著
作者: (美)H.M.Deitel, P.J.Deitel
作者: Kenneth Barclay;John Savage
参考读物推荐
作者: 高彦杰 倪亚宇 著
作者: J.D.Meier;Carlos Farre;Prashant Bansode;Scott Barber;Dennis Rea
作者: (美)Jos Dirksen 著