编写高质量代码:改善C#程序的157个建议

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

建议130:以复数命名枚举类型,
3
以单数命名枚举元素
建议131:用PascalCasing命名 4 公开元素
10 命名规范
建议132:考虑用类名作为属性
5

建议133:用camelCasing命名 6 私有字段和局部变量
第三部分 编码规范 及习惯
10 命名规范
01
ห้องสมุดไป่ตู้
建议134:有条件地使用前

02
建议135:考虑使用肯定性
的短语命名布尔属性
03
建议136:优先使用后缀表
示已有类型的新版本
04
建议137:委托和事件类型
应添加上级后缀
05
建议138:事件和委托变量
使用动词或形容词短语命名
06
建议139:事件处理器命名
采用组合方式
第三部分 编码规范 及习惯
11 代码整洁
M.94275.CN
01 建 议 1 4 0 : 使 用 默 认 的 访 问 修 饰 符
A
建议120:为程序集 指定强名称
B
建议121:为应用程 序设定运行权限
C
9 安全性设计
第三部分 编码规范及习惯
05
第三部分 编码规范及习惯
10 命名 规范
11 代码 整洁
12 规范 开发行为
第三部分 编码规范及习惯
建议122:以<Company>.<
1
Component>为命名空间命名
建议123:程序集不必与命名空 2 间同名
建议31:在LINQ查询中避免不必 要的迭代
建议32:总是优先 考虑泛型
1
建议37:使用
Lambda表达式代
6
替方法和匿名方法
建议36:使用FCL 中的委托声明
5
第一部分 语言篇
3 泛型、委托和事件
建议33:避免在泛
2
型类型中声明静态成

3
建议34:为泛型参 数设定约束
建议35:使用
4
default为泛型类型
0 1
建议146:只对 外公布必要的操 作
0 2
建议147:重构 多个相关属性为 一个类
0 3
建议148:不重 复代码
0 4
建议149:使用 表驱动法避免过 长的if和switch 分支
0 5
建议150:使用 匿名方法、 Lambda表达式 代替方法
0 6
建议151:使用 事件访问器替换 公开的事件成员 变量
第一部分 语言篇
建议44:理解委 托中的协变
A
建议45:为泛型 类型参数指定逆变
B
3 泛型、委托和事件
第一部分 语言篇
01
建议46:显式释放资源需继承接口IDisposable
02
建议47:即使提供了显式释放方法,也应该在终结器中提供隐式 清理
03
建议48:Dispose方法应允许被多次调用
04
第三部分 编码规范 及习惯
11 代码整洁
A
建议152:最少, 甚至是不要注释
建议153:若抛出 异常,则必须要注

B
第三部分 编码规范及习惯
01
建议154:不要过度设计,在敏捷中体会重构的乐趣
02
建议155:随生产代码一起提交单元测试代码
03
建议156:利用特性为应用程序提供多个版本
04
建议157:从写第一个界面开始,就进行自动化测试
建议78:应 避免线程数量
过多
第一部分 语言篇
6 异步、多线程、任务和并行
建议79:使用 ThreadPool或 Background
Worker代替 Thread
建议80:用 Ta s k 代 替
ThreadPool
建议81:使 用Parallel简 化同步状态下 Ta s k 的 使 用
建议82: Parallel简化 但不等同于 Ta s k 默 认 行
象类提供公开的构
组或集合作为属性
override和new
造方法
B
D
F
第二部分 架构篇
7 成员设计
第二部分 架构篇
7 成员设计
01
建议96:成员应优先考虑
公开基类型或接口
02
建议97:优先考虑将基类
型或接口作为参数传递
03
建议98:用params减少
重复参数
04
建议99:重写时不应使用
子类参数
05
建议100:静态方法和实
第二部分 架构篇
1
建议108:将类型标 识为sealed
2
建议109:谨慎使用 嵌套类
3
建议110:用类来代 替enum
4
建议111:避免双向 耦合
5
建议112:将现实世界中的 对象抽象为类,将可复用对
象圈起来就是命名空间
8 类型设计
第二部分 架构篇
01
建议113:声明 变量前考虑最大 值
02
03
3 泛型、委托和事 件
2 集合和LINQ
4 资源管理和序列 化
5 异常与自定义异 常
6 异步、多线程、 任务和并行
第一部分 语言篇
建议1:正确操作字符串
建议6:区别readonly和 const的使用方法
06
01
02
建议2:使用默认转型方 法
建议5:使用int?来确保 值类型也可以为null
05
04
6
建议62:避免嵌套 异常
5
建议59:不要在不
2
恰当的场合下引发异

建议60:重新引发
3
异常时使用Inner
Exception
5 异常与自定义异常
建议61:避免在
4
finally内撰写无效
代码
建议64:为循环增加 Tester-Doer模式而不是 将try-catch置于循环内
建议69:应使用finally 避免资源泄漏
第一部分 语言篇
2 集合和LINQ
建议23:避免将List<T> 作为自定义集合类的基类
建议24:迭代器应该是 只读的
建议25:谨慎集合属性 的可写操作
建议28:理解延迟求值和主动求值 之间的区别
建议30:使用LINQ取代集合中的 比较器和迭代器
第一部分 语言篇
2 集合和LINQ
建议29:区别LINQ查询中的IEnumerable <T>和IQueryable<T>
建议89:在并行方法体中 谨慎使用锁
第二部分 架构篇
04
第二部分 架构篇
01
7 成员设 计
02
8 类型设 计
03
9 安全性 设计
A
C
E
建议91:可见字段 应该重构为属性
建议93:构造方法 应初始化主要属性
和字段
建议95:避免在构 造方法中调用虚成

建议90:不要为抽
建议92:谨慎将数
建议94:区别对待
建议71:
1 区分异步 和多线程 应用场景
建议72:
2 在线程同 步中使用 信号量
建议73:
3 避免锁定 不恰当的 同步对象
建议74:警
4 惕线程的 IsBackgro und
建议75:
5 警惕线程 不会立即 启动
建议76:
6 警惕线程 的优先级
6 异步、多线程、任务和并行
建议77:正 确停止线程
变量指定初始值
第一部分 语言篇
建议38:小心闭包 中的陷阱
建议43: 让接口中 的泛型参 数支持协 变
01 06
05
建议42:使用泛型 参数兼容泛型接口的 不可变性
建议39:了解委托 的实质
02 03
04
建议40: 使用 event关 键字为委 托施加保 护
建议41:实现标准 的事件模型
3 泛型、委托和事件
建议114:MD5 不再安全
建议115:通过 HASH来验证文 件是否被篡改
04
建议116:避免 用非对称算法加 密文件
05
建议117:使用 SSL确保通信中 的数据安全
06
建议118:使用 SecureString保 存密钥等机密字 符串
9 安全性设计
第二部分 架构篇
建议119:不要使用 自己的加密算法
建议52:及时 释放资源
建议57:实现 ISerializable的 子类型应负责父 类的序列化
4 资源管理和序列化
建议53:必要时 应将不再使用的 对象引用赋值为 null
建议55:利用定 制特性减少可序 列化的字段
第一部分 语言篇
建议58:用抛出异 常代替返回错误代码
1
建议63:避免“吃 掉”异常
12 规范开发行为
感谢聆听
02
建议141:不知道该不该用大括号 时,就用
03 建 议 1 4 2 : 总 是 提 供 有 意 义 的 命 名
04
建议143:方法抽象级别应在同一 层次
05 建 议 1 4 4 : 一 个 方 法 只 做 一 件 事
06
建议145:避免过长的方法和过长 的类
第三部分 编码 规范及习惯
11 代码整洁

建议83:小心Parallel中的 陷阱
建议85:Task中的异常处 理
建议87:区分WPF和 WinForm的线程模型
第一部分 语言篇
6 异步、多线程、任务和并行
建议84:使用PLINQ
建议86:Parallel中的异常 处理
建议88:并行并不总是速 度更快
第一部分 语言篇
6 异步、多线程、任务和并行
2020
编写高质量代码:改善C# 程序的157个建议
目录
01. 为什么写这本书 02. 资源及勘误 03. 第一部分 语言篇 04. 第二部分 架构篇 05. 第三部分 编码规范及习惯
为什么写这本书
01
为什么写这本书
资源及勘误
02
资源及勘误
第一部分 语言篇
03
第一部分 语言篇
1 基本语言要素
建议19:使用更有 效的对象和集合初
始化
建议21:选择正 确的集合
建议16:元素数量
建议18:foreach
建议20:使用泛型
可变的情况下不应 使用数组
不能代替for
集合代替非泛型集 合
B
D
F
建议22:确保集合的线 程安全
建议27:在查询中使 用Lambda表达式
建议26:使用匿名类型 存储LINQ查询结果
建议124:考虑在命名空间中使
3
用复数
10 命名规范
建议125:避免用FCL的类型名 4 称命名自己的类型
建议126:用名词和名词组给类
5
型命名
建议127:用形容词组给接口命 6 名
第三部分 编码规范及习惯
建议128:考虑让派生类的名字
1
以基类名字作为后缀
建议129:泛型类型参数要以T 2 作为前缀
建议9:习惯重 载运算符
建议11:区别对 待==和Equals
B
D
F
建议13:为类型输 出格式化字符串
第一部分 语言篇
1 基本语言要素
建议14:正确实现 浅拷贝和深拷贝
建议15:使用 dynamic来简化反
射实现
第一部分 语言篇
2 集合和LINQ
A
C
E
建议17:多数情况 下使用foreach进
行循环遍历
建议49:在Dispose模式中应提取一个受保护的虚方法
05
建议50:在Dispose模式中应区别对待托管资源和非托管资源
06
建议51:具有可释放字段的类型或拥有本机资源的类型应该是可 释放的
4 资源管理和序列化
第一部分 语言篇
建议54:为无 用字段标注不 可序列化
建议56:使用继 承ISerializable 接口更灵活地控 制序列化过程
03
建议3:区别对待强制转 型与as和is
建议4:TryParse比 Parse好
1 基本语言要素
第一部分 语言篇
1 基本语言要素
A
C
E
建议8:避免给枚举 类型的元素提供显
式的值
建议10:创建对象 时需要考虑是否实
现比较器
建议12:重写 Equals时也要重写
GetHashCode
建议7:将0值作 为枚举的默认值
建议68:从 System.Exception或其他 常见的基本异常中派生异常
第一部分 语言篇
5 异常与自定义异常
建议65:总是处理未捕 获的异常
建议66:正确捕获多线 程中的异常
建议67:慎用自定义异 常
第一部分 语言篇
5 异常与自定义异常
建议70:避免在调用栈较低的位置记录 异常
第一部分 语言篇
例方法没有区别
06
建议101:使用扩展方法,
向现有类型“添加”方法
建议102:区分接口和抽象 类的应用场合
建议104:用多态代替条件 语句
建议106:为静态类添加静 态构造函数
第二部分 架构篇
8 类型设计
建议103:区分组合和继承 的应用场合
建议105:使用私有构造函 数强化单例
建议107:区分静态类和单 例
相关文档
最新文档