跳转至

《Effective C#》

简介

《Effective C#:改善 C#代码的 50 个有效方法》是 2018 年 5 月由机械工业出版社出版的图书,作者是比尔·瓦格纳([美] Bill Wagner)。本书中给出了 50 条建议,告诉你怎样充分利用 C#6.0 所具备的特性来编写健壮而高效的代码。这些建议反映了 C#开发界的新进展,也令人体会到 C#这门语言已经越来越成熟。除了提出许多种改善代码品质的新方式,例如怎样发挥泛型的优势之外,本书还针对 LINQ 给出了很多条建议。

我于 2024 年 12 月开始拜读此书,对其中条例清晰、例证丰富的“Specific Ways”颇以为然,做读书摘要记录之。

《Effective C#:改善 C#代码的 50 个有效方法》
《Effective C# (Covers C# 6.0): 50 Specific Ways to Improve Your C#》
检索 豆瓣读书
封面 Snipaste_2024-12-17_23-37-23

读书摘要

第 1 章 C#语言的编程习惯

第 1 条:优先使用隐式类型的局部变量

第 2 条:考虑用 readonly 代替 const

第 3 条:优先考虑 is 或 as 运算符,尽量少用强制类型转换

第 4 条:用内插字符串取代 string.Format()

第 5 条:用 FormattableString 取代专门为特定区域而写的字符串

第 6 条:不要用表示符号名称的硬字符串来调用 API

第 7 条:用委托表示回调

第 8 条:用 null 条件运算符调用事件处理程序

第 9 条:尽量避免装箱与取消装箱这两种操作

第 10 条:只有在应对新版基类与现有子类之间的冲突时才应该使用 new 修饰符

第 2 章 .NET 的资源管理

第 11 条:理解并善用.NET 的资源管理机制

第 12 条:声明字段时,尽量直接为其设定初始值

第 13 条:用适当的方式初始化类中的静态成员

第 14 条:尽量删减重复的初始化逻辑

第 15 条:不用创建无谓的对象

第 16 条:绝对不要在构造函数里面调用虚函数

第 17 条:实现标准的 dispose 模式

第 3 章 合理地运用泛型

第 18 条:只定义刚好够用的约束条件

第 19 条:通过运行期类型检查实现特定的泛型算法

第 20 条:通过 IComparable及 IComparer定义顺序关系

第 21 条:创建泛型类时,总是应该给实现了 IDisposable 的类型参数提供支持

第 22 条:考虑支持泛型协变与逆变

第 23 条:用委托要求类型参数必须提供某种方法

第 24 条:如果有泛型,就不要再创建针对基类或接口的重载版本

第 25 条:如果不需要把类型参数所表示的对象设为实例字段,那么应该优先考虑创建泛型方法,而不是泛型类

第 26 条:实现泛型接口的同时,还应该实现非泛型接口

第 27 条:只把必备的契约定义在接口中,把其他功能留给扩展方法去实现

第 28 条:考虑通过扩展方法增强已构造类型的功能

第 4 章 合理地运用 LINQ

第 29 条:优先考虑提供迭代器方法,而不要返回集合

第 30 条:优先考虑通过查询语句来编写代码,而不要使用循环语句

第 31 条:把针对序列的 API 设计得更加易于拼接

第 32 条:将迭代逻辑与操作、谓词及函数解耦

第 33 条:等真正用到序列中的元素时再去生成

第 34 条:考虑通过函数参数来放松耦合关系

第 35 条:绝对不要重载扩展方法

第 36 条:理解查询表达式与方法调用之间的映射关系

第 37 条:尽量采用惰性求值的方式来查询,而不要及早求值

第 38 条:考虑用 lamba 表达式来代替方法

第 39 条:不用在 Func 与 Action 中抛出异常

第 40 条:掌握尽早执行与延迟执行之间的区别

第 41 条:不要把开销较大的资源捕获到闭包中

第 42 条:注意 IEnumerable 与 IQueryable 形式的数据源之间的区别

第 43 条:用 Single() 及 First() 来明确地验证你对查询结果所做的假设

第 44 条:不要修改绑定变量

第 5 章 合理地运用异常

第 45 条:考虑在方法约定遭到违背时抛出异常

第 46 条:利用 using 与 try/finally 来清理资源

第 47 条:专门针对应用程序创建异常

第 48 条:优先考虑做出强异常保证

第 49 条:优先用异常筛选器来改写先捕获异常再重新抛出的逻辑

第 50 条:合理利用异常筛选器的副作用来实现某些效果