第Ⅰ部分 基础篇 1
第1章 面向对象编程的基础知识 1
1.1 一切都是“对象” 2
1.1.1 对象和类 5
1.1.2 实例化 6
1.2 面向对象编程语言的三大原则 7
1.2.1 封装 8
1.2.2 继承 10
1.2.3 多态性 13
1.3 本章小结 16
第2章Microsoft.NET简介 17
2.1 Microsoft.NET平台 17
2.2 .NET框架 18
2.2.1 Windows DNA和.NET 18
2.2.2 公共语言运行环境 18
2.2.3 .NET框架类库 19
2.2.4 Microsoft中间语言和JITters 21
2.2.5 统一的类型系统 22
2.2.6 元数据和反射 23
2.2.7 安全问题 24
2.2.8 部署 24
2.2.9 与非控代码的互用性 25
2.3 本章小结 26
第3章 C#应用程序简介 27
3.1 编写第一个C#应用程序 27
3.1.1 选择编辑器 27
3.1.2 “Hello,World” 29
3.1.3 使用命令行编译器 30
3.1.4 运行应用程序 31
3.2 代码详解 32
3.2.1 “直达式”编程 32
3.2.2 类和成员 32
3.2.5 名称空间和指示符using 33
3.2.4 System.console.WriteLine方法 33
3.2.3 Main方法 33
3.2.6 骨架代码 35
3.3 出错情况 36
3.4 ILDASM研究 37
3.5 C#编程原则 41
3.5.1 何时定义您自己的名称空间 41
3.5.2 命名原则 41
3.5.3 命名规范标准 42
3.6 本章小结 44
第Ⅱ部分 C#类基础 47
第4章 类型系统 47
4.1 一切都是对象 47
4.2 数值类型和引用类型 48
4.2.1 数值类型 48
4.2.2 引用类型 48
4.3 装箱与开箱 49
4.4 所有类型的根:System.object 50
4.5 类型和别名 51
4.6 类型之间的转换 52
4.7 名称空间 54
4.8 CTS的好处 56
4.8.1 语言互用性 56
4.8.2 单根的对象层次结构 56
4.8.3 类型安全 57
4.9 本章小结 57
第5章 类 58
5.1 定义类 58
5.2 类的成员 58
5.3 访问限定符 59
5.4 Main方法 61
5.4.1 命令行参数 61
5.4.2 返回值 62
5.4.3 多个Main方法 63
5.5 构造函数 64
5.5.1 静态成员和实例成员 66
5.5.2 构造函数的初始化函数 67
5.6 常量和只读字段 70
5.6.1 常量 71
5.6.2 只读字段 71
5.7 对象清除和资源管理 73
5.7.1 历史回顾 74
5.7.2 确定性结束 74
5.7.3 性能 76
5.7.4 完美的解决方案 81
5.7.5 近乎完美的解决方案 82
5.7.6 Dispose设计模式 83
5.8 继承 84
5.8.1 多接口 86
5.8.2 封装类 87
5.9 本章小结 88
第6章 方法 89
6.1 方法参数“ref”和“out” 89
6.2 方法重载 94
6.3 可变的方法参数 96
6.4 虚拟方法 98
6.4.1 方法覆盖 98
6.4.2 多态性 99
6.5 静态方法 106
6.6 本章小结 108
第7章 属性、数组和索引器 109
7.1 属性——智能字段 109
7.1.1 定义和使用属性 110
7.1.2 编译器的工作原理 111
7.1.3 只读属性 113
7.1.4 继承属性 114
7.1.5 属性的高级使用 114
7.2.1 声明数组 115
7.2 数组 115
7.2.2 一维数组 116
7.2.3 多维数组 117
7.2.4 查询秩 119
7.2.5 锯齿状数组 120
7.3 使用索引器将对象当作数组对待 122
7.3.1 定义索引器 123
7.3.2 索引器示例程序 123
7.3.3 设计规则 125
7.4 本章小结 126
第8章 特性 127
8.1 特性的介绍 127
8.2 特性的定义 128
8.3 对特性进行查询 130
8.3.1 类的特性 130
8.3.2 方法的特性 132
8.3.3 字段的特性 134
8.4.1 定位参数和命名参数 136
8.4 特性的参数 136
8.4.2 使用命名参数时的常见错误 138
8.4.3 有效的特性参数类型 138
8.5 AttributeUsage特性 139
8.5.1 定义一个特性目标 139
8.5.2 单次特性和多次特性 141
8.5.3 指定继承特性的规则 142
8.6 特性标识符 143
8.7 本章小结 144
第9章 接口 145
9.1 接口的应用 145
9.2 声明接口 147
9.3 实现接口 148
9.3.1 使用is来查询实现 150
9.3.2 使用is来查询实现 153
9.4 显式的按口成员名字限定 157
9.4.1 接口的名字隐藏 157
9.4.2 避免名字模糊性 160
9.5 接口和继承 164
9.6 合并接口 167
9.7 本章小结 169
第Ⅲ部分 编定代码 171
第10章 表达式和操作符 171
10.1 已定义的操作符 171
10.2 操作符的优先级 172
10.2.1 C#如何判断优先级 172
10.2.2 左联合性和右联合性 173
10.2.3 实际使用 174
10.3 C#操作符 175
10.3.1 初级表达式操作符 175
10.3.2 数学操作符 179
10.3.3 关系操作符 188
10.3.4 简单赋值操作符 190
10.4 本章小结 193
11.1.1 if语句 194
第11章 程序流程控制 194
11.1 选择语句 194
11.1.2 多个else子句 195
11.1.3 C#如何强制使用if规则 197
11.1.4 switch语句 199
11.1.5 组合情况标签 201
11.1.6 在switch语句中设有“贯行” 203
11.2 迭代语句 204
11.2.1 while语句 204
11.2.2 do/while语句 206
11.2.3 for语句 208
11.2.4 嵌套循环 209
11.2.5 使用逗号操作符 210
11.2.6 foreach语句 211
11.3 跳转语句 213
11.3.1 break语句 213
11.3.2 中断无究循环 214
11.3.3 continue语句 216
11.3.4 “声名狼藉”的goto语句 217
11.3.5 return语句 223
11.4 本章小结 223
第12章 用异常进行错误处理 224
12.1 异常处理概览 224
12.2 异常处理的基本语法 225
12.2.1 抛出异常 225
12.2.2 截获异常 226
12.2.3 重抛异常 227
12.2.4 用finally进行清除 228
12.3 错误处理技术之比较 229
12.3.1 异常处理相对于返回代码的优点 229
12.3.2 在正确的上下文环境中处理错误 231
12.3.3 提高代码的可读性 232
12.4 使用System,Exception类 234
12.3.4 从构造函数抛出异常 234
12.4.1 构造一个Exception对象 235
12.4.2 使用StackTrace属性 237
12.4.3 截获多个异常类型 238
12.4.4 派生出自己的Exception类 239
12.5 设计具有异常处理功能的代码 241
12.5.1 使用try块时的设计注意事项 241
12.5.2 使用catch块时的设计注意事项 243
12.6 本章小结 245
第13章 操作符重载和用户定义的转换 246
13.1 操作符重载 246
13.1.1 语法和例子 247
13.1.2 可重载操作符 250
13.1.3 操作符重载的限制 250
13.1.4 设计准则 250
13.2 用户定义的转换 251
13.3 本章小结 257
14.1 将代表用作回调方法 258
第14章 代表和事件处理器 258
14.2 把代表定义为静态成员 261
14.3 仅在需要时创建代表 263
14.4 代表构成 265
14.5 定义具有代表的事件 272
14.6 本章小结 276
第Ⅳ部分 高级C# 277
第15章 多线程编程 277
15.1 线程的基本知识 277
15.1.1 线程与多任务 278
15.1.2 上下文切换 278
15.2 C#语言中的多线程应用程序 278
15.4.4 线程安全和. NET类 279
15.3 线程处理 280
15.3.1 AppDomain 280
15.3.2 Thread类 280
15.3.3 线程调度 284
15.4.1 使用Monitor类保护代码 288
15.4 线程安全和同步 288
15.4.2 用C#中的lock语句使用Monitor锁 293
15.4.3 通过使用Mutex类同步化代码 294
15.5 使用线程的原则 297
15.5.1 何时使用线程 297
15.5.2 保时不应该使用线程 298
15.6 本章小结 299
第16章 利用反射查询元数据 300
16.1 反射API层次 300
16.2 Type类 301
16.2.1 检索一个实例的类型 301
16.2.2 根据名字检索类型 301
16.2.3 查询类型 302
16.3 使用组合体和模块 304
16.3.1 迭代组合体的类型 305
16.3.2 列出组合体的模块 307
16.4 用反射进行后期绑定 309
16.5 在运行时刻创建并执行代码 312
16.6 本章小结 316
第17章 与非控代码互操作 317
17.1 平台启用服务 317
17.1.1 声明导出的DLL函数 317
17.1.2 与C#共用回调函数 320
17.1.3 江集和PInvoke 321
17.2 编写非安全代码 322
17.2.1 在C#中使用指针 323
17.2.2 fixed语句 324
17.3 COM互操作性 326
17.3.1 一个全新的领域 326
17.3.2 入门 326
17.3.3 从COM类型库生成元数据 328
17.3.4 早期绑定COM组件 330
17.3.5 利用动态类型探索选择COM接口 332
17.3.6 后期绑定COM组件 333
17.3.7 COM线程模型 335
17.4 本章小结 336
第18章 使用组合体 338
18.1 组合体概览 338
18.2 组合体的优点 339
18.2.1 组合体的打包 340
18.2.2 组合体的部署 340
18.2.3 组合体的版本管理 340
18.3 建立组合体 341
18.4 创建共享组合体 343
18.5 使用全局组合体缓存区 345
18.6 组合体的版本管理 347
18.6.1 QFE和默认版本管理策略 350
18.6.2 创建安全模式部署文件 350
18.6.3 使用组合体的特定版本 351
18.7 本章小结 352