译者序
前言
第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
第17条:不要把类的内部对象通过引用返回给外界 / 87
第18条:优先考虑重写相关的方法,而不是创建事件处理程序 / 91
第19条:不要重载基类中定义的方法 / 94
第20条:了解事件机制为何会提升对象在运行期的耦合程度 / 98
第21条:不要把事件声明成virtual / 100
第22条:尽量把重载方法创建得清晰、简洁而完备 / 106
第23条:让 partial类的构造函数、mutator方法和事件处理程序调用适当的partial方法 / 112
第24条:尽量不要实现ICloneable接口,以便留出更多的设计空间 / 117
第25条:数组类型的参数应该用params加以修饰 / 122
第26条:在迭代器与异步方法中定义局部函数,以便尽早地报错 / 126
第3章 基于任务的异步编程 / 131
第27条:使用异步方法执行异步工作 / 131
第28条:不要编写返回值类型为void的异步方法 / 136
第29条:不要把同步方法与异步方法组合起来使用 / 141
第30条:使用异步方法以避免线程分配和上下文切换 / 146
第31条:避免不必要的上下文编组 / 147
第32条:通过Task对象来安排异步工作 / 151
第33条:考虑实现任务取消协议 / 157
第34条:缓存泛型异步方法的返回值 / 164
第4章 并行处理 / 167
第35条:了解PLINQ是怎样实现并行算法的 / 167
第36条:编写并行算法时要考虑异常状况 / 179
第37条:优先使用线程池而不是创建新的线程 / 185
第38条:考虑使用BackgroundWorker在线程之间通信 / 190
第39条:学会在XAML环境下执行跨线程调用 / 194
第40条:首先考虑用lock()实现同步 / 202
第41条:尽量缩减锁定范围 / 209
第42条:不要在加了锁的区域内调用未知的方法 / 212
第5章 动态编程 / 217
第43条:了解动态编程的优点及缺点 / 217
第44条:通过动态编程技术更好地运用泛型参数的运行期类型 / 226
第45条:使用DynamicObject和IDynamicMetaObjectProvider实现数据驱动的动态类型 / 229
第46条:学会正确使用Expression API / 240
第47条:尽量减少公有API中的动态对象 / 246
第6章 加入全球C#社区 / 253
第48条:最流行的写法不一定最合适 / 253
第49条:与大家一起制定规范并编写代码 / 255
第50条:考虑用分析器自动检查代码质量 / 256
中英文词汇对照表 / 258