描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121342653丛书名: 原味精品书系
√ More Effective C# 升级版本
√ 应用开发者常备书目
√ 深度理解C#编程语言
Item 1: Prefer Implicitly Typed Local Variables ………………………………………………….. 1
Item 2: Prefer readonly to const …………………………………………………………………………. 7
Item 3: Prefer the is or as Operators to Casts ……………………………………………………… 12
Item 4: Replace string.Format() with Interpolated Strings ……………………………………. 19
Item 5: Prefer FormattableString for Culture-Specific Strings ……………………………… 23
Item 6: Avoid String-ly Typed APIs …………………………………………………………………. 26
Item 7: Express Callbacks with Delegates …………………………………………………………. 28
Item 8: Use the Null Conditional Operator for Event Invocations …………………………. 31
Item 9: Minimize Boxing and Unboxing …………………………………………………………… 34
Item 10: Use the new Modifier Only to React to Base Class Updates ……………………. 38
Chapter 2 .NET Resource Management ………………………………………….. 43
Item 11: Understand .NET Resource Management ……………………………………………… 43
Item 12: Prefer Member Initializers to Assignment Statements …………………………….. 48
Item 13: Use Proper Initialization for Static Class Members ………………………………… 51
Item 14: Minimize Duplicate Initialization Logic ……………………………………………….. 53
Item 15: Avoid Creating Unnecessary Objects …………………………………………………… 61
Item 16: Never Call Virtual Functions in Constructors ………………………………………… 65
Item 17: Implement the Standard Dispose Pattern ………………………………………………. 68
Chapter 3 Working with Generics ………………………………………………….. 77
Item 18: Always Define Constraints That Are Minimal and Sufficient ………………….. 79
Item 19: Specialize Generic Algorithms Using Runtime Type Checking ……………….. 85
Item 20: Implement Ordering Relations with IComparable<T> and IComparer<T> .. 92
Item 21: Always Create Generic Classes That Support Disposable Type Parameters . 98
Item 22: Support Generic Covariance and Contravariance …………………………………. 101
Item 23: Use Delegates to Define Method Constraints on Type Parameters …………. 107
Item 24: Do Not Create Generic Specialization on Base Classes or Interfaces ………. 112
Item 25: Prefer Generic Methods Unless Type Parameters Are Instance Fields ……. 116
Item 26: Implement Classic Interfaces in Addition to Generic Interfaces …………….. 120
Item 27: Augment Minimal Interface Contracts with Extension Methods ……………. 126
Item 28: Consider Enhancing Constructed Types with Extension Methods ………….. 130
Chapter 4 Working with LINQ …………………………………………………….. 133
Item 29: Prefer Iterator Methods to Returning Collections …………………………………. 133
Item 30: Prefer Query Syntax to Loops ……………………………………………………………. 139
Item 31: Create Composable APIs for Sequences ……………………………………………… 144
Item 32: Decouple Iterations from Actions, Predicates, and Functions ………………… 151
Item 33: Generate Sequence Items as Requested ………………………………………………. 154
Item 34: Loosen Coupling by Using Function Parameters………………………………….. 157
Item 35: Never Overload Extension Methods …………………………………………………… 163
Item 36: Understand How Query Expressions Map to Method Calls …………………… 167
Item 37: Prefer Lazy Evaluation to Eager Evaluation in Queries ………………………… 179
Item 38: Prefer Lambda Expressions to Methods ……………………………………………… 184
Item 39: Avoid Throwing Exceptions in Functions and Actions …………………………. 188
Item 40: Distinguish Early from Deferred Execution ………………………………………… 191
Item 41: Avoid Capturing Expensive Resources ……………………………………………….. 195
Item 42: Distinguish between IEnumerable and IQueryable Data Sources …………… 208
Item 43: Use Single() and First() to Enforce Semantic Expectations on Queries …… 212
Item 44: Avoid Modifying Bound Variables …………………………………………………….. 215
Chapter 5 Exception Practices ………………………………………………………. 221
Item 45: Use Exceptions to Report Method Contract Failures …………………………….. 221
Item 46: Utilize using and try/finally for Resource Cleanup……………………………….. 225
Item 47: Create Complete Application-Specific Exception Classes …………………….. 232
Item 48: Prefer the Strong Exception Guarantee ……………………………………………….. 237
Item 49: Prefer Exception Filters to catch and re-throw …………………………………….. 245
Item 50: Leverage Side Effects in Exception Filters ………………………………………….. 249
Index ……………………………………………………………………………………………. 253
一名高效率的.NET开发者需要对他所选择的语言有很深的理解。本书通过合理的探讨以一定的洞察力将这种知识传授给读者。无论是C#新手还是资深开发者,都会通过阅读本书而有所收获。
——Jason Bock,Magenic首席顾问
如果你像我一样,已经掌握了大量的C#语言精华,而且这些已经使你迅速地成为一名专业的开发者,那么现在你拿在手中的很可能是C#指导材料中很棒的一本合集。Bill的这本Effective C#, Third Edition成功地超出了我的预期。
——Bill Craun,Ambassador Solutions首席顾问
本书对于构建高性能和高扩展性应用的开发者来说是一本常备书目。Bill拥有一种世人少有的令人惊叹的能力,他可以把一个极其复杂的问题拆解为大家可消化的、能理解的一个个小问题。
——Josh Holmes,Microsoft架构师
Bill又一次成功了。这本书对于任何一名C#开发者来说都是一本宝贵的指导书。每天学习一条规则,50天后,你将成为一名更加出色的C#开发者。
——Claudio Lassala,EPS Software/CODE Magazine 项目组长
本书是C#语言知识的源泉。针对你写的代码,Bill对隐藏在.NET运行状态下真正发生的事情进行了深入的阐释,并且教给读者如何书写实践性强、干净简单且更容易理解的代码。这是一本每一个C#开发者都应当阅读的书,是建议、技巧和理解的大集合。
——Brian Noyes,IDesign Inc.(www.idesign.net)首席架构师
Effective C#, Third Edition是每一位C#开发者都必须拥有的一本书。就当下来说,书中所涉及的对于代码设计的实用建议是非常宝贵的。
——Shawn Wildermuth,Microsoft MVP(C#)、作家、培训师、演说家
在本书中,Bill Wagner对于如何使用C#语言的重要特征给出了切实可行的阐释。他用丰富的知识和成熟的交流技巧阐明了C#的新特征,以便你使用它们来写出更简单、易维护的程序。
——Charlie Calvert,Microsoft C#社区程序经理
前言
与2004年Effective C#第1版刚出版的时候相比,如今的C#社区已经有了很大的变化。现在有更多的开发者在使用C#。大量的C#社区的出现证明了C#已经成为一门专业的编程语言,很多程序员使用其他编程语言时养成了许多根深蒂固的恶习,这种现象在C#当中并没有出现。C#社区吸纳了更多开发者的经验,从刚毕业的学生到拥有数十年经验的专业开发者都在使用C#。C#现在可以在多个平台上运行,也可以用于构建服务端应用、网站、桌面应用以及多平台下的移动端应用程序。
在写作本书时,我同时考虑到了C#语言本身的变化和C#社区的变化。本书并没有过多地讲解语言变化的历史,只是提供了如何使用当前C#语言的建议。在这一版中删掉的内容都是与如今的C#语言以及应用程序不相关的。新增的内容覆盖了语言和框架的新特性,以及C#社区在使用C#构建多版本的软件产品时总结出来的实践经验。看过之前版本的读者会发现,这一版中包含了More Effective C#第1版中的内容(虽然删除了很多章节)。在第3版中,我重新组织了全书,新的版本将会覆盖很多其他的概念。总之,本书的50个小节是帮助专业开发者更高效地使用C#的一组建议。
本书假定的是C# 6.0环境,它并不是对新语言特性的详尽阐述。正如Effective Software Development系列中的其他书一样,它对如何使用这些特性去解决每天可能会遇到的问题给出了实践性的建议。本书特意涵盖了C# 6.0的新特性,这些新的特性给出了更新、更好的方法来编写常用的语法。互联网搜索给出的结果可能依旧是那些陈旧的早期解决方案。书中同样给出了旧的解决方法,通过对比说明通过改进语言可以有更好的解决方法。
书中的许多建议已经被Roslyn-based Analyzers和Code Fixes证实有效。我为它们维护了一个仓库,地址为https://github.com/BillWagner/EffectiveCSharpAnalyzers。如果你有什么想法或者希望做些贡献,可以写一个issue或者发给我一个pull request。
本书读者
本书主要写给那些把C#当作日常开发工具的专业开发者,阅读者需要熟悉C#语法和语言特性。本书不包含对语言特性的阐述,只是讨论如何把当前C#语言的所有特性集成到日常开发中去。
除了语言特性,你还需要了解公共语言运行库(CLR)和即时编译器(JIT)。
关于内容
每一段C#程序的编写几乎都会用到语法结构。第1章包含了那些如同常用工具一样被频繁使用的语法。它们是创建的每一种类型和实现每一个算法的构建代码块。
在一个开发环境下工作,并不意味着能够免除你所有的职责。你必须与环境协同工作来创造出正确的、能够满足既定性能需求的程序,而不仅仅是性能测试和性能调节。第2章讲述了一些设计模式,它们能让你与环境协同工作,在开始优化细节之前就能达成那些性能指标。
从C# 2.0开始,范型让任何事物都能使用C#语言进行描述。第3章涵盖了作为System.Object替代品的范型的概念并介绍了cast,进而讨论了相关的高级技术,比如:约束、范型特化、方法约束以及向后兼容。你将会学到几种范型技术,使用它们可以更容易地表达出你的设计意图。
第4章解释了LINQ、查询语法和一些相关特性。你将会了解何时使用扩展方法来从实现当中分离出协议、如何高效地使用C#闭包,以及如何使用匿名类型编程。你将会学到如何为方法调用编译映射查询关键字,如何区分委托和表达式树(并且在需要时改装它们),以及当你希望得到标量结果时如何避免查询语句。
第5章提供了管理现代C#程序异常和错误的指导。你将会学到如何确保合适地报告错误以及当有错误发生时如何保持程序状态稳定不变。还能学会如何为使用你代码的开发者一种良好的debug体验。
代码约定
由于篇幅有限,所以代码需要在完整性和明确性上做一些妥协。本书代码通常会省略类或方法中的一部分内容,有时为了节省空间还会省略错误回收代码。公共方法应该验证它们的参数和其他输入,但是为了节省空间,这部分代码通常也被省略掉了。同样出于空间上的考虑,那些在复杂算法中应当包含的方法调用验证和try/finally语句也会被忽略掉。
我认为大多数开发者都能找到合适的命名空间,书中的例子便使用了一些常用的命名空间。你可以放心地认为每一个例子都隐式地包含了以下using声明:
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
反馈渠道
尽管我和审校本书的工作人员都非常努力,但仍然可能会有错误出现。如果你发现了错误,请通过邮箱[email protected]联系我,或者在Twitter上@billwagner。书中的许多小节都是与其他C#开发者通过邮件或者在Twitter上交流的结果。如果你对书中的内容有任何疑问或者建议,请联系我。读者感兴趣的问题将会在我的博客中进行讨论,地址为http://thebillwagner.com/blog。
致谢
有很多人为这本书做出了贡献,我应该感谢他们。多年以来,我很荣幸成为一个非常棒的C#社区的一员。每一个在C#邮件组里的人(无论是否在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系列丛书中的一员,再一次让我倍感荣幸。他浏览了每一篇手稿并且提出了改进建议。虽然他没有做过C#开发,但他难以置信的缜密和在软件方面的经验,让他能找到任何一处我没有解释清楚的地方或者不太合适的建议。他的反馈一直都是无价的。
我放弃了很多与家人相处的时间来完成本书的写作。我的妻子Marlene,在我外出写作或者创建代码示例时,牺牲了大量的时间。没有她的支持,我不可能写完本书或者其他任何一本书,本书的完成也不会像现在这样令人高兴。
关于作者
Bill Wagner是世界上著名的C#开发者之一,是ECMA C#标准委员会的成员。他是Humanitarian Toolbox的主席,连续11年被授予Microsoft Regional Director和.NET MVP荣誉称号,近他刚刚被委派到.NET基础顾问理事会任职。Wagner曾在各种公司工作过,从初创小公司到大企业都有,他帮助他们推进软件开发进程、培养他们的软件开发团队,目前他就职于Microsoft的.NET
评论
还没有评论。