前言 1
第1章 C#和.NET Framework简介 7
1.1 面向对象 7
1.2 类型安全性 8
1.3 内存管理 9
1.4 平台支持 9
1.5 C#和CLR 9
1.6 CLR和.NET Framework 10
1.7 其他框架 11
1.7.1 遗留框架和小众框架 12
1.7.2 Windows Runtime 12
1.8 C#简史 13
1.8.1 C#7.0新特性 14
1.8.2 C#6.0新特性 17
1.8.3 C#5.0新特性 18
1.8.4 C#4.0新特性 19
1.8.5 C#3.0新特性 19
1.8.6 C#2.0新特性 20
第2章 C#语言基础 21
2.1 第一个C#程序 21
2.2 语法 24
2.2.1 标识符和关键字 24
2.2.2 字面量、标点与运算符 26
2.2.3 注释 26
2.3 类型基础 27
2.3.1 预定义类型示例 27
2.3.2 自定义类型示例 28
2.3.3 转换 30
2.3.4 值类型与引用类型 31
2.3.5 预定义类型分类 34
2.4 数值类型 35
2.4.1 数值字面量 36
2.4.2 数值转换 38
2.4.3 算术运算符 39
2.4.4 自增和自减运算符 39
2.4.5 特殊整数类型运算 39
2.4.6 8位和16位整数类型 41
2.4.7 特殊的float和double值 41
2.4.8 double和decimal的对比 42
2.4.9 实数的舍入误差 43
2.5 布尔类型和运算符 43
2.5.1 布尔类型转换 43
2.5.2 相等和比较运算符 44
2.5.3 条件运算符 44
2.6 字符串和字符 45
2.6.1 char转换 46
2.6.2 字符串类型 46
2.7 数组 48
2.7.1 默认数组元素初始化 49
2.7.2 多维数组 49
2.7.3 简化数组初始化表达式 51
2.7.4 边界检查 52
2.8 变量和参数 52
2.8.1 栈和堆 52
2.8.2 明确赋值 54
2.8.3 默认值 54
2.8.4 参数 55
2.8.5 引用局部变量(C#7) 61
2.8.6 引用返回值(C#7) 61
2.8.7 var隐式类型局部变量 61
2.9 表达式和运算符 62
2.9.1 基础表达式 63
2.9.2 空表达式 63
2.9.3 赋值表达式 63
2.9.4 运算符优先级和结合性 64
2.9.5 运算符表 64
2.10 null运算符 68
2.10.1 null合并运算符 68
2.10.2 null条件运算符(C#6) 68
2.11 语句 69
2.11.1 声明语句 69
2.11.2 表达式语句 70
2.11.3 选择语句 71
2.11.4 迭代语句 75
2.11.5 跳转语句 77
2.11.6 其他语句 78
2.12 命名空间 79
2.12.1 using指令 80
2.12.2 using static指令(C#6) 80
2.12.3 命名空间中的规则 81
2.12.4 类型和命名空间别名 83
2.12.5 高级命名空间特性 83
第3章 在C#中创建类型 86
3.1 类 86
3.1.1 字段 86
3.1.2 方法 87
3.1.3 实例构造器 89
3.1.4 对象初始化器 92
3.1.5 this引用 94
3.1.6 属性 94
3.1.7 索引器 97
3.1.8 常量 98
3.1.9 静态构造器 99
3.1.10 静态类 100
3.1.11 终结器 101
3.1.12 分部类型和方法 101
3.1.13 nameof运算符(C#6) 102
3.2 继承 103
3.2.1 多态 104
3.2.2 类型转换和引用转换 104
3.2.3 虚函数成员 107
3.2.4 抽象类和抽象成员 108
3.2.5 隐藏继承成员 108
3.2.6 密封函数和类 110
3.2.7 base关键字 110
3.2.8 构造器和继承 110
3.2.9 重载和解析 112
3.3 object类型 112
3.3.1 装箱和拆箱 113
3.3.2 静态和运行时类型检查 114
3.3.3 GetType方法和typeof运算符 115
3.3.4 ToString方法 115
3.3.5 object的成员列表 116
3.4 结构体 116
3.5 访问权限修饰符 118
3.5.1 示例 118
3.5.2 友元程序集 119
3.5.3 可访问性封顶 119
3.5.4 访问权限修饰符的限制 119
3.6 接口 120
3.6.1 扩展接口 121
3.6.2 显式接口实现 121
3.6.3 虚方法实现接口成员 122
3.6.4 在子类中重新实现接口 122
3.6.5 接口和装箱 124
3.7 枚举类型 125
3.7.1 枚举类型转换 126
3.7.2 标志枚举类型 126
3.7.3 枚举运算符 127
3.7.4 类型安全问题 127
3.8 嵌套类型 128
3.9 泛型 130
3.9.1 泛型类型 130
3.9.2 为什么需要泛型 131
3.9.3 泛型方法 132
3.9.4 声明类型参数 133
3.9.5 typeof和未绑定泛型类型 133
3.9.6 泛型的默认值 134
3.9.7 泛型的约束 134
3.9.8 继承泛型类型 136
3.9.9 自引用泛型声明 136
3.9.10 静态数据 136
3.9.11 类型参数的转换 137
3.9.12 协变 138
3.9.13 逆变 141
3.9.14 C#泛型和C+++模板对比 142
第4章 C#的高级特性 143
4.1 委托 143
4.1.1 用委托书写插件方法 144
4.1.2 多播委托 145
4.1.3 实例目标方法和静态目标方法 147
4.1.4 泛型委托类型 147
4.1.5 Func和Action委托 148
4.1.6 委托和接口 149
4.1.7 委托的兼容性 150
4.2 事件 152
4.2.1 标准事件模式 154
4.2.2 事件访问器 158
4.2.3 事件的修饰符 159
4.3 Lambda表达式 159
4.3.1 显式指定Lambda参数的类型 160
4.3.2 捕获外部变量 161
4.3.3 Lambda表达式和局部方法的对比 163
4.4 匿名方法 164
4.5 try语句和异常 165
4.5.1 catch子句 167
4.5.2 finally块 168
4.5.3 抛出异常 170
4.5.4 System.Exception的关键属性 172
4.5.5 常用的异常类型 172
4.5.6 TryXXX方法模式 173
4.5.7 异常的替代方式 173
4.6 可枚举类型和迭代器 174
4.6.1 可枚举类型 174
4.6.2 集合的初始化器 175
4.6.3 迭代器 176
4.6.4 迭代器语义 177
4.6.5 组合序列 178
4.7 可空类型 180
4.7.1 Nullable<T>结构体 180
4.7.2 隐式和显式的可空对象转换 180
4.7.3 装箱拆箱可空值 181
4.7.4 运算符优先级提升 181
4.7.5 在bool?上使用&和|运算符 183
4.7.6 可空类型和null运算符 183
4.7.7 可空类型的应用场景 184
4.7.8 可空类型的替代方案 184
4.8 扩展方法 185
4.8.1 扩展方法链 186
4.8.2 二义性与解析 186
4.9 匿名类型 188
4.10 元组(C#7) 189
4.10.1 元组元素命名 190
4.10.2 ValueTuple.Create 192
4.10.3 元组的解构 192
4.10.4 元组的比较 193
4.10.5 System.Tuple类 193
4.11 特性 193
4.11.1 特性类 194
4.11.2 命名和位置特性参数 194
4.11.3 特性的目标 195
4.11.4 指定多个特性 195
4.12 调用者信息特性 195
4.13 动态绑定 197
4.13.1 静态绑定与动态绑定 197
4.13.2 自定义绑定 198
4.13.3 语言绑定 199
4.13.4 RuntimeBinderException 200
4.13.5 动态类型的运行时表示 200
4.13.6 动态转换 201
4.13.7 var与dynamic 201
4.13.8 动态表达式 202
4.13.9 无动态接收者的动态调用 202
4.13.10 动态表达式中的静态类型 203
4.13.11 不可调用的函数 204
4.14 运算符重载 205
4.14.1 运算符函数 206
4.14.2 重载等号和比较运算符 206
4.14.3 自定义隐式和显式转换 207
4.14.4 重载true和false 208
4.15 不安全的代码和指针 209
4.15.1 指针基础 209
4.15.2 不安全的代码 209
4.15.3 fixed语句 209
4.15.4 指针取成员运算符 210
4.15.5 数组 210
4.15.6 void* 211
4.15.7 指向非托管代码的指针 212
4.16 预处理指令 212
4.16.1 Conditional特性 213
4.16.2 Pragma警告 214
4.17 XML文档 214
4.17.1 标准的XML文档标签 215
4.17.2 用户定义标签 217
4.17.3 类型或成员交叉引用 217
第5章 框架概述 219
5.1.NET标准2.0 221
5.1.1 旧版本.NET标准 222
5.1.2 引用程序集 222
5.2 CLR和核心框架 223
5.2.1 系统类型 223
5.2.2 文本处理 223
5.2.3 集合 223
5.2.4 查询 224
5.2.5 XML 224
5.2.6 诊断 224
5.2.7 并发与异步 225
5.2.8 流与I/O 225
5.2.9 网络 225
5.2.10 序列化 225
5.2.11 程序集、反射和特性 226
5.2.12 动态编程 226
5.2.13 安全性 226
5.2.14 高级线程功能 226
5.2.15 并行编程 227
5.2.16 应用程序域 227
5.2.17 原生互操作性与COM互操作性 227
5.3 应用技术 227
5.3.1 用户界面API 227
5.3.2 后台技术 230
5.3.3 分布式系统技术 232
第6章 框架基础 234
6.1 字符串与文本处理 234
6.1.1 字符 234
6.1.2 字符串 236
6.1.3 字符串的比较 240
6.1.4 StringBuilder 243
6.1.5 文本编码和Unicode 244
6.2 日期和时间 248
6.2.1 TimeSpan 248
6.2.2 DateTime和DateTimeOffset 249
6.3 日期和时区 255
6.3.1 DateTime与时区 256
6.3.2 DateTimeOffset与时区 256
6.3.3 TimeZone和TimeZoneInfo 257
6.3.4 夏令时与DateTime 261
6.4 格式化和解析 262
6.4.1 ToString和Parse 263
6.4.2 格式提供器 263
6.5 标准格式字符串与解析标记 268
6.5.1 数字格式字符串 268
6.5.2 NumberStyles 270
6.5.3 Date/Time格式字符串 272
6.5.4 DateTimeStyles 275
6.5.5 枚举的格式字符串 275
6.6 其他转换机制 275
6.6.1 Convert类 276
6.6.2 XmlConvert 278
6.6.3 类型转换器 278
6.6.4 BitConverter 279
6.7 全球化 279
6.7.1 全球化检查清单 280
6.7.2 测试 280
6.8 操作数字 281
6.8.1 转换 281
6.8.2 Math 281
6.8.3 BigInteger 282
6.8.4 Complex 283
6.8.5 Random 284
6.9 枚举 285
6.9.1 枚举值转换 285
6.9.2 列举枚举值 287
6.9.3 枚举的工作方式 288
6.10 Guid结构体 288
6.11 相等比较 289
6.11.1 值相等和引用相等 289
6.11.2 标准等值比较协议 290
6.11.3 相等比较和自定义类型 295
6.12 顺序比较 300
6.12.1 IComparable 300
6.12.2 <和> 301
6.12.3 实现IComparable接口 302
6.13 实用类 303
6.13.1 Console类 303
6.13.2 Environment类 304
6.13.3 Process类 304
6.13.4 AppContext类 306
第7章 集合 307
7.1 枚举 307
7.1.1 IEnumerable和IEnumerator 308
7.1.2 IEnumerable<T>和IEnumerator<T> 309
7.1.3 实现枚举接口 311
7.2 ICollection和IList接口 315
7.2.1 ICollection<T>和ICollection 316
7.2.2 IList<T>和IList 317
7.2.3 IReadOnlyList<T> 318
7.3 Array类 318
7.3.1 创建和索引 321
7.3.2 枚举 322
7.3.3 长度和维数 323
7.3.4 搜索 323
7.3.5 排序 325
7.3.6 反转数组元素 326
7.3.7 复制数组 326
7.3.8 转换和调整大小 326
7.4 List、Queue、Stack和Set 327
7.4.1 List<T>和ArrayList 327
7.4.2 LinkedList<T> 330
7.4.3 Queue<T>和Queue 332
7.4.4 Stack<T>和Stack 332
7.4.5 BitArray 333
7.4.6 HashSet<T>和SortedSet<T> 334
7.5 字典 336
7.5.1 IDictionary<TKey,TValue> 336
7.5.2 IDictionary 338
7.5.3 Dictionary<TKey,TValue>和HashTable 339
7.5.4 OrderedDictionary 340
7.5.5 ListDictionary和HybridDictionary 340
7.5.6 排序字典 341
7.6 自定义集合与代理 342
7.6.1 Collection<T>和CollectionBase 343
7.6.2 KeyedCollection<TKey,TValue>和DictionaryBase 345
7.6.3 ReadOnlyCollection<T> 348
7.7 扩展相等比较和排序操作 349
7.7.1 IEqualityComparer和EqualityComparer 350
7.7.2 IComparer和Comparer 352
7.7.3 StringComparer 353
7.7.4 IStructuralEquatable和IStructuralComparable 355
第8章 LINQ查询 356
8.1 入门 356
8.2 流式语法 358
8.2.1 查询运算符链 359
8.2.2 使用Lambda表达式 361
8.2.3 原始顺序 364
8.2.4 其他运算符 364
8.3 查询表达式 365
8.3.1 范围变量 367
8.3.2 LINQ查询语法与SQL语法 368
8.3.3 查询语法和流式语法 368
8.3.4 混合查询语法 369
8.4 延迟执行 369
8.4.1 重复执行 370
8.4.2 捕获变量 371
8.4.3 延迟执行的工作原理 372
8.4.4 串联装饰器 373
8.4.5 查询语句的执行方式 375
8.5 子查询 376
8.6 构造方式 379
8.6.1 渐进式查询构造 379
8.6.2 into关键字 380
8.6.3 查询的包装 381
8.7 映射方式 382
8.7.1 对象初始化器 382
8.7.2 匿名类型 383
8.7.3 let关键字 384
8.8 解释型查询 385
8.8.1 解释型查询的工作机制 387
8.8.2 综合使用解释型查询和本地查询 389
8.8.3 AsEnumerable方法 390
8.9 LINQ to SQL和Entity Framework 391
8.9.1 LINQ to SQL的实体类 392
8.9.2 Entity Framework的实体类 393
8.9.3 DataContext和ObjectContext 395
8.9.4 关联 399
8.9.5 L2S和EF的延迟执行 400
8.9.6 DataLoadOptions 401
8.9.7 Entity Framework中的立即加载功能 403
8.9.8 更新 403
8.9.9 L2S和EF的API对比 405
8.10 构建查询表达式 406
8.10.1 委托与表达式树 406
8.10.2 表达式树 408
第9章 LINQ运算符 412
9.1 概述 413
9.1.1 序列→序列 414
9.1.2 序列→元素或标量值 415
9.1.3 void→序列 416
9.2 筛选 416
9.2.1 Where 417
9.2.2 Take和Skip运算符 419
9.2.3 TakeWhile和SkipWhile 420
9.2.4 Distinct 420
9.3 映射 420
9.3.1 Select 421
9.3.2 SelectMany 425
9.4 连接 433
9.4.1 Join和GroupJoin 433
9.4.2 Zip运算符 441
9.5 排序 441
9.6 分组 444
9.7 集合运算符 448
9.7.1 Concat和Union 448
9.7.2 Intersect和Except 448
9.8 转换方法 449
9.8.1 OfType和Cast 449
9.8.2 ToArray、ToList、ToDictionary和ToLookup 451
9.8.3 AsEnumerable和AsQueryable 451
9.9 元素运算符 452
9.9.1 First、Last和Single 452
9.9.2 ElementAt运算符 453
9.9.3 DefaultlfEmpty 453
9.10 聚合方法 454
9.10.1 Count和LongCount 454
9.10.2 Min和Max 454
9.10.3 Sum和Average 455
9.10.4 Aggregate 456
9.11 量词运算符 458
9.11.1 Contains和Any 459
9.11.2 All和SequenceEqual 459
9.12 生成集合的方法 460
9.12.1 Empty 460
9.12.2 Range和Repeat 460
第10章 LINQ to XML 461
10.1 架构概述 461
10.1.1 什么是DOM 461
10.1.2 LINQ to XML的DOM 462
10.2 X-DOM概述 462
10.2.1 加载和解析 464
10.2.2 保存和序列化 465
10.3 实例化X-DOM 466
10.3.1 函数式构建 466
10.3.2 指定内容 467
10.3.3 自动深度克隆 468
10.4 导航和查询 468
10.4.1 导航至子节点 469
10.4.2 导航至父节点 472
10.4.3 导航至同级节点 473
10.4.4 导航至节点的属性 473
10.5 更新X-DOM 474
10.5.1 简单的值更新 474
10.5.2 更新子节点和属性 474
10.5.3 通过父节点更新子节点 475
10.6 使用Value 477
10.6.1 设置Value 477
10.6.2 获得Value 478
10.6.3 值与混合内容节点 479
10.6.4 自动连接XText节点 479
10.7 文档和声明 480
10.7.1 XDocument 480
10.7.2 XML声明 482
10.8 名称和命名空间 483
10.8.1 XML中的命名空间 484
10.8.2 在X-DOM中指定命名空间 486
10.8.3 X-DOM和默认命名空间 487
10.8.4 前缀 488
10.9 注解 489
10.10 将数据映射到X-DOM 490
10.10.1 排除空元素 492
10.10.2 流映射 493
10.10.3 转换X-DOM 494
第11章 其他XML技术 497
11.1 XmlReader 497
11.1.1 读取节点 499
11.1.2 读取元素 501
11.1.3 读取属性 505
11.1.4 命名空间和前缀 506
11.2 XmlWriter 507
11.2.1 写入属性 508
11.2.2 写入其他类型节点 508
11.2.3 命名空间和前缀 509
11.3 XmlReader/XmlWriter的使用模式 509
11.3.1 处理多层次结构数据 509
11.3.2 混合使用XmlReader/XmlWriter和X-DOM 512
11.4 XSD和大纲的验证 513
11.5 XSLT 516
第12章 对象销毁与垃圾回收 518
12.1 IDisposable接口、Dispose方法和Close方法 518
12.1.1 标准销毁语义 519
12.1.2 销毁对象的时机 520
12.1.3 选择性销毁 522
12.1.4 在销毁时清理字段 523
12.2 自动垃圾回收 524
12.2.1 根 525
12.2.2 垃圾回收和WinRT 525
12.3 终结器 525
12.3.1 在终结器中调用Dispose 527
12.3.2 对象的复活 528
12.4 垃圾回收器的工作方式 530
12.4.1 优化技术 531
12.4.2 强制垃圾回收 534
12.4.3 垃圾回收过程的调整 534
12.4.4 内存压力 535
12.5 托管内存泄露 535
12.5.1 定时器 536
12.5.2 诊断内存泄露 538
12.6 弱引用 538
12.6.1 弱引用和缓存 539
12.6.2 弱引用和事件 540
第13章 诊断 543
13.1 条件编译 543
13.1.1 条件编译与静态变量标志 544
13.1.2 Conditional特性 545
13.2 Debug和Trace类 547
13.2.1 Fail和Assert方法 547
13.2.2 TraceListener类 548
13.2.3 刷新并关闭监听器 550
13.3 调试器的集成 550
13.3.1 附加和断点 551
13.3.2 Debugger特性 551
13.4 进程与线程处理 551
13.4.1 检查运行中的进程 552
13.4.2 在进程中检查线程 552
13.5 StackTrace和StackFrame类 552
13.6 Windows事件日志 554
13.6.1 写入事件日志 555
13.6.2 读取事件日志 555
13.6.3 监视事件日志 556
13.7 性能计数器 557
13.7.1 遍历可用的计数器 557
13.7.2 检索性能计数器 558
13.7.3 创建计数器并写入性能数据 560
13.8 Stopwatch类 562
第14章 并发与异步 563
14.1 概述 563
14.2 线程 564
14.2.1 创建线程 564
14.2.2 汇合与休眠 566
14.2.3 阻塞 566
14.2.4 本地状态与共享状态 568
14.2.5 锁与线程安全 570
14.2.6 向线程传递数据 571
14.2.7 异常处理 573
14.2.8 前台线程与后台线程 574
14.2.9 线程的优先级 575
14.2.10 信号发送 576
14.2.11 富客户端应用程序的线程 576
14.2.12 同步上下文 578
14.2.13 线程池 579
14.3 任务 581
14.3.1 启动任务 582
14.3.2 返回值 583
14.3.3 异常 584
14.3.4 延续 585
14.3.5 TaskCompletionSource类 587
14.3.6 Task.Delay方法 589
14.4 异步原则 590
14.4.1 同步操作与异步操作 590
14.4.2 什么是异步编程 590
14.4.3 异步编程与延续 591
14.4.4 语言支持的重要性 593
14.5 C#的异步函数 595
14.5.1 等待 595
14.5.2 编写异步函数 601
14.5.3 异步Lambda表达式 605
14.5.4 WinRT中的异步方法 606
14.5.5 异步与同步上下文 606
14.5.6 优化 608
14.6 异步模式 610
14.6.1 取消操作 610
14.6.2 进度报告 612
14.6.3 基于任务的异步模式 614
14.6.4 任务组合器 614
14.7 已废弃的模式 618
14.7.1 异步编程模型(APM) 618
14.7.2 基于事件的异步模式(EAP) 619
14.7.3 BackgroundWorker类 620
第15章 流与I/O 622
15.1.NET流的架构 622
15.2 使用流 624
15.2.1 读取和写入 626
15.2.2 查找 627
15.2.3 关闭和刷新 627
15.2.4 超时 628
15.2.5 线程安全 628
15.2.6 后台存储流 628
15.2.7 FileStream类 629
15.2.8 MemoryStream 632
15.2.9 PipeStream 633
15.2.10 BufferedStream 636
15.3 流适配器 637
15.3.1 文本适配器 638
15.3.2 二进制适配器 643
15.3.3 关闭和销毁流适配器 644
15.4 压缩流 646
15.5 操作ZIP文件 648
15.6 文件与目录操作 649
15.6.1 File类 649
15.6.2 Directory类 652
15.6.3 FileInfo类和DirectoryInfo类 653
15.6.4 Path类型 654
15.6.5 特殊文件夹 655
15.6.6 查询卷信息 658
15.6.7 捕获文件系统事件 658
15.7 在UWP中进行文件I/O操作 659
15.7.1 操作目录 660
15.7.2 操作文件 661
15.7.3 UWP应用的独立存储区 662
15.8 内存映射文件 662
15.8.1 内存映射文件和随机I/O 662
15.8.2 内存映射文件和共享内存 663
15.8.3 使用视图访问器 663
15.9 独立存储区 664
第16章 网络 665
16.1.NET网络架构 665
16.2 地址与端口 667
16.3 URI 668
16.4 客户端类型 670
16.4.1 WebClient类 671
16.4.2 WebRequest和WebResponse 673
16.4.3 HttpClient类 675
16.4.4 代理 679
16.4.5 身份验证 680
16.4.6 异常处理 682
16.5 使用HTTP 684
16.5.1 头部信息 684
16.5.2 查询字符串 685
16.5.3 上传表单数据 686
16.5.4 cookie 687
16.5.5 表单验证 688
16.5.6 SSL 690
16.6 编写HTTP服务器 690
16.7 使用FTP 693
16.8 使用DNS 695
16.9 通过SmtpClient类发送邮件 696
16.10 使用TCP 697
16.11 使用TCP接收POP3邮件 700
16.12 在Windows Runtime中使用TCP 702
第17章 序列化 704
17.1 序列化的概念 704
17.1.1 序列化引擎 704
17.1.2 格式化器 707
17.1.3 显式和隐式序列化 707
17.2 数据契约的序列化 708
17.2.1 DataContractSerializer与NetDataContractSerializer 708
17.2.2 使用序列化器 709
17.2.3 序列化子类 712
17.2.4 对象引用 713
17.2.5 版本容错性 716
17.2.6 成员顺序 716
17.2.7 null和空值 717
17.3 数据契约与集合 718
17.3.1 子类集合元素 719
17.3.2 自定义集合与元素名称 719
17.4 扩展数据契约 720
17.4.1 序列化与反序列化钩子 721
17.4.2 与[Serializable]的互操作 722
17.4.3 与IXmlSerializable的互操作 724
17.5 二进制序列化器 724
17.6 二进制序列化特性 726
17.6.1 [NonSerialized] 726
17.6.2 [OnDeserializing]和[OnDeserialized] 726
17.6.3 [OnSerializing]和[OnSerialized] 727
17.6.4 [OptionalField]特性和版本 728
17.7 使用ISerializable接口进行二进制序列化 729
17.8 XML序列化 733
17.8.1 基于特性的序列化入门 733
17.8.2 子类和子对象 735
17.8.3 序列化集合 738
17.8.4 IXmlSerializable接口 741
第18章 程序集 743
18.1 程序集的组成部分 743
18.1.1 程序集清单 744
18.1.2 应用程序清单 745
18.1.3 模块 746
18.1.4 Assembly类 747
18.2 强名称和程序集签名 748
18.2.1 如何为程序集添加强名称 749
18.2.2 延迟签名 750
18.3 程序集名称 751
18.3.1 完全限定名称 751
18.3.2 AssemblyName类 752
18.3.3 程序集的信息版本和文件版本 753
18.4 认证代码签名 753
18.4.1 如何进行认证代码签名 755
18.4.2 认证代码验证 756
18.5 全局程序集缓存 757
18.5.1 如何将程序集安装到GAC 758
18.5.2 GAC和版本控制 759
18.6 资源和附属程序集 759
18.6.1 直接嵌入资源 760
18.6.2.resources文件 762
18.6.3.resx文件 762
18.6.4 附属程序集 765
18.6.5 文化和子文化 767
18.7 程序集的解析和加载 768
18.7.1 程序集和类型解析规则 769
18.7.2 AssemblyResolve事件 769
21.2.2 声明式安全性与命令式安全性 854
21.2.3 实现身份和角色安全 855
21.2.4 设定用户和角色 855
21.3 操作系统安全性 856
21.3.1 在标准用户账户下运行程序 857
21.3.2 管理员权限提升与虚拟化 858
21.4 加密概述 859
21.5 Windows数据保护 859
21.6 散列法 860
21.7 对称加密 862
21.7.1 内存加密 863
21.7.2 串联加密流 864
21.7.3 销毁加密对象 866
21.7.4 密钥管理 866
21.8 公钥加密和签名 867
21.8.1 RSA类 868
21.8.2 数字签名 869
第22章 高级线程处理 871
22.1 同步概述 871
22.2 排它锁 872
22.2.1 lock语句 872
22.2.2 Monitor.Enter方法和Monitor.Exit方法 873
22.2.3 选择同步对象 874
22.2.4 使用锁的时机 875
22.2.5 锁与原子性 876
22.2.6 嵌套锁 877
22.2.7 死锁 878
22.2.8 性能 879
22.2.9 Mutex 879
22.3 锁和线程安全性 880
22.3.1 线程安全和.NET Framework类型 882
22.3.2 应用服务器的线程安全性 884
22.3.3 不可变对象 885
22.4 非排它锁 886
22.4.1 信号量 886
22.4.2 读写锁 887
22.5 使用事件等待句柄发送信号 892
22.5.1 AutoResetEvent 892
22.5.2 ManualResetEvent 895
22.5.3 CountdownEvent 896
22.5.4 创建跨进程的EventWaitHandle 897
22.5.5 等待句柄和延续操作 897
22.5.6 将等待句柄转换为任务 898
22.5.7 WaitAny、WaitAll和SignalAndWait 899
22.6 Barrier类 900
22.7 延迟初始化 902
22.7.1 Lazy<T> 903
22.7.2 LazyInitializer类 903
22.8 线程本地存储 904
22.8.1 [ThreadStatic]特性 905
22.8.2 ThreadLocal<T>类 905
22.8.3 GetData方法和SetData方法 906
22.9 Interrupt和Abort方法 906
22.10 Suspend和Resume方法 908
22.11 定时器 908
22.11.1 多线程定时器 909
22.11.2 单线程定时器 911
第23章 并行编程 913
23.1 选择PFX的原因 913
23.1.1 PFX的概念 914
23.1.2 PFX组件 914
23.1.3 使用PFX的场合 916
23.2 PLINQ 916
23.2.1 并行执行的特性 918
23.2.2 PLINQ与顺序 919
23.2.3 PLINQ的限制 919
23.2.4 示例:并行拼写检查器 920
23.2.5 纯函数 922
23.2.6 设置并行级别 922
23.2.7 取消操作 923
23.2.8 PLINQ优化 924
23.3 Parallel类 929
23.3.1 Parallel.Invoke方法 929
23.3.2 Parallel.For方法和Parallel.ForEach方法 930
23.4 任务并行 935
23.4.1 创建并启动任务 936
23.4.2 等待多个任务 938
23.4.3 取消任务 939
23.4.4 延续任务 940
23.4.5 任务调度器 944
23.4.6 TaskFactory类 945
23.5 处理AggregateException 945
23.6 并发集合 948
23.6.1 IProducerConsumerCollection<T>接口 949
23.6.2 ConcurrentBag<T>类 950
23.7 BlockingCollection<T>类 951
第24章 应用程序域 955
24.1 应用程序域的架构 955
24.2 创建和销毁应用程序域 956
24.3 使用多个应用程序域 958
24.4 DoCallBack方法 960
24.5 监视应用程序域 961
24.6 应用程序域和线程 961
24.7 在应用程序域间共享数据 963
24.7.1 通过“槽”共享数据 963
24.7.2 进程内Remoting通信 964
24.7.3 隔离类型与程序集 965
第25章 原生程序和COM组件互操作性 969
25.1 调用原生DLL 969
25.2 类型的封送 970
25.2.1 常见类型的封送 970
25.2.2 类和结构体的封送 971
25.2.3 in和out参数封送 973
25.3 非托管代码中的回调函数 973
25.4 模拟C共用体 974
25.5 共享内存 975
25.6 将结构体映射到非托管内存中 977
25.7 COM互操作性 981
25.7.1 COM的目的 981
25.7.2 COM类型系统基础 982
25.8 在C#中调用COM组件 983
25.8.1 可选参数和命名参数 984
25.8.2 隐式ref参数 985
25.8.3 索引器 985
25.8.4 动态绑定 986
25.9 内嵌互操作类型 987
25.10 主互操作程序集 988
25.11 在COM中调用C#对象 988
第26章 正则表达式 989
26.1 正则表达式基础 990
26.1.1 编译正则表达式 991
26.1.2 RegexOptions属性 991
26.1.3 字符转义 992
26.1.4 字符集合 993
26.2 量词符号 994
26.3 零宽度断言 995
26.3.1 前向条件和后向条件 995
26.3.2 锚点 996
26.3.3 单词边界 997
26.4 分组 998
26.5 替换并分割文本 1000
26.5.1 MatchEvaluator委托 1000
26.5.2 拆分文本 1001
26.6 正则表达式实例 1001
26.6.1 匹配美国社会保险号/电话号码 1001
26.6.2 提取“name=value”中的名称和值(一行一个) 1001
26.6.3 强密码验证 1002
26.6.4 每行至少80个字符 1002
26.6.5 解析日期/时间(N/N/N H:M:S AM/PM) 1002
26.6.6 匹配罗马字符 1003
26.6.7 删除重复单词 1003
26.6.8 统计单词数目 1003
26.6.9 匹配Guid 1003
26.6.10 解析XML/HTML标签 1003
26.6.11 分隔驼峰命名单词 1004
26.6.12 获得合法的文件名 1004
26.6.13 将Unicode字符转义为HTML 1004
26.6.14 反转义HTTP查询字符串中的字符 1004
26.6.15 从网站统计日志中解析谷歌搜索关键词 1005
26.7 正则表达式语言参考 1005
第27章 Roslyn编译器 1009
27.1 Roslyn架构 1010
27.2 语法树 1011
27.2.1 语法树的结构 1011
27.2.2 获取语法树 1014
27.2.3 语法树的遍历和搜索 1015
27.2.4 非关键信息 1019
27.2.5 语法树的转换 1022
27.3 编译过程和语义模型 1026
27.3.1 创建编译过程 1026
27.3.2 生成程序集 1028
27.3.3 查询语义模型 1028
27.3.4 示例:修改符号名称 1033