第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