第一部分 C#语言基础 2
第1章 C#类型基础 2
1.1 值类型和引用类型 2
1.1.1 值类型 2
1.1.2 引用类型 5
1.1.3 简单类型 6
1.1.4 装箱和拆箱 7
1.2 对象判等 8
1.2.1 引用类型判等 9
1.2.2 简单值类型判等 10
1.2.3 复杂值类型判等 12
1.3 对象复制 14
1.3.1 浅度复制 14
1.3.2 深度复制 17
1.4 不可变类型 19
1.4.1 从类型设计谈起,Class还是Struet 19
1.4.2 数据不一致的问题 20
1.4.3 常量性和原子性 20
1.4.4 避免外部类型对类型内部的访问 21
1.5 本章小结 23
第2章 C#中的泛型 24
2.1 理解泛型 24
2.1.1 为什么要有泛型 24
2.1.2 类型参数约束 27
2.1.3 泛型方法 31
2.2 泛型与集合类型 32
2.2.1 避免隐式的装箱和拆箱 32
2.2.2 编译时的类型安全 34
2.2.3 使用泛型的一个小技巧 34
2.3 本章小结 35
第3章 C#中的委托和事件 36
3.1 理解委托 36
3.1.1 将方法作为方法的参数 36
3.1.2 将方法绑定到委托 39
3.1.3 委托与接口 41
3.2 事件的由来 42
3.2.1 更好的封装性 42
3.2.2 限制类型能力 45
3.3 委托的编译代码 47
3.4 .NET框架中的委托和事件 48
3.4.1 示例说明 48
3.4.2 Observer设计模式简介 49
3.4.3 实现示例的Observer设计模式 50
3.4.4 .NET框架中的委托与事件 51
3.5 委托进阶 53
3.5.1 为什么委托定义的返回值通常都为void 53
3.5.2 如何让事件只允许一个客户订阅 54
3.5.3 获得多个返回值与异常处理 56
3.6 订阅者方法超时的处理 60
3.7 委托和方法的异步调用 64
3.8 不使用委托实现Observer模式 69
3.8.1 设计思想概述 69
3.8.2 Observer模式的接口定义 70
3.8.3 Observer模式的实现 72
3.8.4 推模式和拉模式 74
3.8.5 推模式和拉模式的区别 79
3.9 本章小结 79
第4章 对象的筛选和排序 80
4.1 对象的筛选 80
4.1.1 基于拼装SQL的筛选 80
4.1.2 基于对象的筛选 84
4.1.3 事件探查器 89
4.2 对象的排序 89
4.2.1 简单排序——对固定属性的默认排序 90
4.2.2 高级排序——多个属性组合排序 92
4.2.3 页面调用 96
4.3 本章小结 96
第5章 LINQ 97
5.1 LINQ预备知识 98
5.1.1 泛型和委托 98
5.1.2 隐式类型的局部变量 100
5.1.3 匿名类型 101
5.1.4 扩展方法 102
5.1.5 匿名方法和Lambda表达式 104
5.2 集合 107
5.2.1 理解集合 107
5.2.2 创建集合类 108
5.2.3 实现IEnumerable<T>接口 113
5.3 LINQ查询 115
5.3.1 LINQ to Objects 115
5.3.2 查询表达式 116
5.3.3 延迟加载 117
5.3.4 混合使用LINQ to Objects 120
5.4 LINQ查询运算符 121
5.4.1 返回IEnumerable<T> 121
5.4.2 返回其他序列类型 127
5.4.3 返回序列中元素 127
5.4.4 返回标量值 129
5.4.5 其他方法 130
5.5 本章小结 130
第二部分 .NET框架 132
第6章 认识.NET平台 132
6.1 引子 132
6.2 CIL——公共中间语言 133
6.3 BCI和FCL 136
6.3.1 BCI——基类库 136
6.3.2 FCI——框架类库 140
6.4 CTS——公共类型系统 140
6.5 CLS——公共语言规范 141
6.6 CLR——公共语言运行时 143
6.6.1 程序集概述 143
6.6.2 运行程序集 145
6.7 CLI——公共语言基础 147
6.8 本章小结 147
第7章 程序集 148
7.1 程序集详探 148
7.1.1 程序集模块 148
7.1.2 清单和元数据 151
7.1.3 程序集资源 153
7.2 强名称程序集 159
7.2.1 非强名称程序集的问题 159
7.2.2 强名称的定义 161
7.2.3 为程序集赋予强名称 162
7.2.4 防篡改和数字签名 163
7.2.5 全局程序集缓存 165
7.2.6 延迟签名 167
7.3 本章小结 168
第8章 流和序列化 169
8.1 文件 169
8.1.1 不同视角下的文件 169
8.1.2 位、字节和字节数组 170
8.2 流 171
8.2.1 关于流的类比 171
8.2.2 使用流进行文件复制 172
8.2.3 流的类型体系 175
8.3 序列化 180
8.3.1 基本操作 180
8.3.2 事件响应 183
8.3.3 自定义序列化过程 186
8.4 本章小结 188
第9章 .NET中的加密和解密 189
9.1 加密和解密的相关概念 189
9.1.1 散列运算 190
9.1.2 对称加密 191
9.1.3 非对称加密 192
9.1.4 数字签名 194
9.1.5 综合实现 195
9.1.6 证书机制 195
9.2 .NET对加密和解密的支持 196
9.2.1 散列运算 196
9.2.2 对称加密和解密 198
9.2.3 非对称加密 201
9.3 本章小结 206
第10章 网络编程 207
10.1 网络编程基本概念 207
10.1.1 面向连接的传输协议——TCP 207
10.1.2 即时通信程序的三种模式 209
10.2 基本操作 211
10.2.1 服务端对端口进行侦听 211
10.2.2 客户端与服务端连接 212
10.2.3 服务端获取客户端连接 215
10.3 同步传输字符串 218
10.3.1 客户端发送,服务端接收并输出 218
10.3.2 服务端回发,客户端接收并输出 224
10.3 中英文字符大小和文本边界问题 226
10.4.1 ASCII、UTF8、Unicode编码下的中英文字符大小 226
10.4.2 文本边界问题 228
10.5 异步传输字符串 233
10.5.1 服务端的实现 234
10.5.2 客户端的实现 235
10.5.3 程序测试 237
10.6 文件传输 238
10.6.1 订立协议 239
10.6.2 协议处理类的实现 240
10.6.3 客户端发送文件 242
10.7 本章小结 249
第11章 .NET Remoting 250
11.1 理解Remoting 250
11.1.1 应用程序域基本概念 250
11.1.2 应用程序域的基本操作 251
11.1.3 在默认应用程序域中创建对象 252
11.1.4 在新建应用程序域中创建对象 253
11.1.5 代理和封送 254
11.1.6 传引用封送示例 256
11.1.7 服务程序集、服务端应用程序(域)和客户端应用程序(域) 258
11.2 Remoting架构 258
11.2.1 客户端(客户应用程序域) 259
11.2.2 服务端(宿主应用程序域) 259
11.2.3 Remoting对象的三种激活方式 259
11.3 Remoting程序的基本操作 261
11.3.1 服务程序集 261
11.3.2 服务端应用程序 262
11.3.3 客户端应用程序 265
11.3.4 程序运行测试 267
11.4 Remoting中的传值封送 271
11.5 分离服务程序集元数据和代码实现 272
11.5.1 使用接口分离服务程序集 273
11.5.2 使用“空类”分离服务程序集 275
11.5.3 使用Soapsuds.exe分离程序集 278
11.5.4 使用工厂方法实现分离 280
11.6 Remoting中的方法回调 283
11.6.1 远程回调方式说明 283
11.6.2 客户端类型和服务端类型 284
11.6.3 服务端、客户端会话模型 286
11.6.4 宿主应用程序 286
11.6.5 程序运行测试 288
11.7 本章小结 289
第12章 在.NET中操作XML 290
12.1 XML概述 290
12.1.1 为什么要有XML 290
12.1.2 XML文档结构 292
12.1.3 XML的处理模型 296
12.1.4 XML验证——XSD、DTD和XDR 297
12.1.5 XML格式转换——XSLT 299
12.1.6 XML选择器——XPATH 299
12.2 操作XML 300
12.2.1 节点类型 300
12.2.2 使用XmlReader和XmlWriter 302
12.2.3 使用XmlDocument和XPath 306
12.2.4 使用XSD验证XML 309
12.2.5 使用XSLT对XML进行转换 311
12.3 本章小结 312
第13章 .NET应用程序配置 314
13.1 .NET中的程序配置介绍 314
13.2 .NET应用程序配置方法 316
13.2.1 使用.NET内置节点和.NET内置处理程序 316
13.2.2 使用自定义节点和.NET内置处理程序 318
13.2.3 使用自定义节点和自定义处理程序 321
13.2.4 “存储”类型实例 329
13.2.5 统一节点配置管理 335
13.3 本章小结 338
第14章 基于角色的安全性 339
14.1 概述 339
14.2 在ASP.NET中使用基于角色的安全性 341
14.3 开始前的准备 341
14.3.1 创建页面,配置Web.config 341
14.3.2 创建用户数据表和数据访问 342
14.4 用户登录——为IIdentity添加用户数据 344
14.4.1 Login.aspx页面实现 344
14.4.2 Default.aspx页面预览 346
14.5 自定义IPrincipal和IIdentity 347
14.6 自定义类型携带用户数据 350
14.7 本章小结 353
第15章 .NET中的反射 354
15.1 反射初步 354
15.1.1 建表及其问题 354
15.1.2 数组及其问题 355
15.1.3 枚举及其问题 356
15.1.4 使用反射遍历枚举字段 357
15.1.5 使用泛型来达到代码重用 359
15.1.6 .NET中反射的一个示例 360
15.2 Type类 362
15.2.1 反射的作用 362
15.2.2 获取Type对象实例 362
15.2.3 Type类型及System.Reflection命名空间的组织结构 362
15.3 反射程序集 365
15.4 反射基本类型 367
15.4.1 获取基本信息 367
15.4.2 成员信息与MemberInfo类型 369
15.4.3 字段信息与FieldInfo类型 371
15.4.4 属性信息与PropertyInfo类型 372
15.4.5 方法信息与MethodInfo类型 373
15.4.6 ConstructorInfo类型和EventInfo类型 373
15.5 反射特性 373
15.5.1 .NET内置特性介绍 374
15.5.2 自定义特性(CustomAttributes) 375
15.5.3 使用反射查看自定义特性 380
15.6 动态创建对象 381
15.6.1 使用无参数构造函数创建对象 381
15.6.2 使用有参数构造函数创建对象 382
15.7 动态调用方法 382
15.7.1 使用InvokeMember调用方法 383
15.7.2 使用MethodInfo.Invoke调用方法 384
15.8 示例:遍历System.Drawing.Color结构 385
15.9 本章小结 388
第16章 多线程 389
16.1 线程的概念 389
16.2 线程的基本操作 392
16.2.1 创建新线程 392
16.2.2 查看当前线程 394
16.2.3 Sleep()方法 394
16.2.4 Interrupt()方法 395
16.2.5 前台线程和后台线程 396
16.2.6 Join()方法 397
16.2.7 Suspend()和Resume()方法 398
16.2.8 线程异常 400
16.2.9 Abort()方法 401
16.3 线程同步 402
16.3.1 使用Monitor 403
16.3.2 使用WaitHandle 413
16.4 本章小结 421
第17章 对象生存期与垃圾收集 422
17.1 基础概念回顾 422
17.2 垃圾回收机制 424
17.2.1 判断哪些对象需要进行回收 424
17.2.2 对象如何分配在堆上 425
17.2.3 垃圾回收的执行过程 426
17.3 对象析构 428
17.3.1 Finalizer析构器 428
17.3.2 Dispose()和Finalize() 429
17.3.3 结合析构器函数和Dispose() 431
17.4 本章小结 432