第1章 C#概述 / 1 1.1 Hello, World / 1 1.2 C#语法基础 / 8 1.3 使用变量 / 14 1.4 控制台输入和输出 / 17 1.5 注释 / 20 1.6 托管执行和CLI / 22 1.7 多个.NET框架 / 26 1.8 小结 / 28 第2章 数据类型 / 29 2.1 基本数值类型 / 29 2.2 更多基本类型 / 36 2.3 null和void / 46 2.4 数据类型转换 / 47 2.5 小结 / 52 第3章 更多数据类型 / 53 3.1 类型的划分 / 53 3.2 可空修饰符 / 55 3.3 元组 / 57 3.4 数组 / 62 3.5 小结 / 74 第4章 操作符和控制流程 / 75 4.1 操作符 / 75 4.2 控制流程概述 / 87 4.3 代码块({}) / 91 4.4 代码块、作用域和声明空间 / 93 4.5 布尔表达式 / 94 4.6 按位操作符(<<,>>,|,&,^,~) / 101 4.7 控制流程语句(续) / 106 4.8 跳转语句 / 115 4.9 C#预处理器指令 / 119 4.10 小结 / 124 第5章 方法和参数 / 126 5.1 方法的调用 / 127 5.2 方法的声明 / 131 5.3 using指令 / 135 5.4 Main()的返回值和参数 / 139 5.5 高级方法参数 / 141 5.6 递归 / 149 5.7 方法重载 / 152 5.8 可选参数 / 154 5.9 用异常实现基本错误处理 / 157 5.10 小结 / 168 第6章 类 / 169 6.1 类的声明和实例化 / 172 6.2 实例字段 / 174 6.3 实例方法 / 176 6.4 使用this关键字 / 177 6.5 访问修饰符 / 183 6.6 属性 / 184 6.7 构造函数 / 197 6.8 静态成员 / 205 6.9 扩展方法 / 213 6.10 封装数据 / 214 6.11 嵌套类 / 216 6.12 分部类 / 218 6.13 小结 / 222 第7章 继承 / 223 7.1 派生 / 224 7.2 重写基类 / 232 7.3 抽象类 / 242 7.4 所有类都从System.Object派生 / 246 7.5 使用is操作符验证基础类型 / 247 7.6 用is操作符进行模式匹配 / 248 7.7 switch语句中的模式匹配 / 248 7.8 使用as操作符进行转换 / 250 7.9 小结 / 251 第8章 接口 / 252 8.1 接口概述 / 253 8.2 通过接口实现多态性 / 254 8.3 接口实现 / 258 8.4 在实现类和接口之间转换 / 262 8.5 接口继承 / 263 8.6 多接口继承 / 265 8.7 接口上的扩展方法 / 265 8.8 通过接口实现多继承 / 266 8.9 版本控制 / 269 8.10 比较接口和类 / 270 8.11 比较接口和特性 / 271 8.12 小结 / 271 第9章 值类型 / 272 9.1 结构 / 275 9.2 装箱 / 279 9.3 枚举 / 285 9.4 小结 / 293 第10章 合式类型 / 295 10.1 重写object的成员 / 295 10.2 操作符重载 / 305 10.3 引用其他程序集 / 311 10.4 定义命名空间 / 318 10.5 XML注释 / 320 10.6 垃圾回收 / 323 10.7 资源清理 / 325 10.8 推迟初始化 / 332 10.9 小结 / 333
第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 |