[套装书]C# 8.0核心技术指南+C#从现象到本质(2册)

作者
约瑟夫·阿坝哈瑞 埃里克·约翰森 郝亦非
丛书名
O’Reilly精品图书系列
出版社
机械工业出版社
ISBN
9782106081715
简要
简介
内容简介书籍计算机书籍 ---------------------------8081278 - C# 8.0核心技术指南--------------------------- 本书全方位地介绍了 C# 的语言特性。在内容上,它兼顾了各种类型的读者。对于初学者,本书不论是介绍基本的语法,还是介绍高级的语言特性,都采用了讲解和示例结合的方法。而对于经验丰富的读者,本书的每一章都详尽而系统,是绝佳的案头参考书。 本书在前一版的基础上进行了大量的修订工作。不但将既有的内容和范例全部迁移到 .NET Core 之上,对 C# 8.0 与 .NET Core 3.x 提供的新特性进行了详细的介绍,还在部分示例中专门对编写跨平台运行的程序的技巧或陷阱进行了说明。可以说,本书从内容上涵盖了目前 C# 与 .NET Core 全新正式发行版的内容。 ---------------------------8050831 - C#从现象到本质--------------------------- 本书以独特的视角对面试过程中求职者存在的问题进行了深度剖析,对目前.NET和C#的就业情况,以及热门的要求进行了提炼。介绍了程序员面试流程,从投递简历开始,到写感谢信,跟人力签约报道上班,等等。然后再分几个方面详细介绍面试题,主要内容包括C#语言基础知识、.NET基础概念、C#核心语法、委托与事件、反射、泛型、可空类型、LINQ、多线程、异步编程、面向对象和基础设计模式、数据库基础知识、基础算法、开发流程等。本书是一本适合计算机相关专业毕业生阅读的求职指导用书,同时也适合期望在计算机软硬件行业大显身手的计算机爱好者阅读。
目录
[套装书具体书目]
8050831 - C#从现象到本质 - 9787111604402 - 机械工业出版社 - 定价 129
8081278 - C# 8.0核心技术指南 - 9787111682561 - 机械工业出版社 - 定价 279



---------------------------8081278 - C# 8.0核心技术指南---------------------------


前言 1
第1章 C#和.NET Core简介7
1.1 面向对象7
1.2 类型安全性8
1.3 内存管理8
1.4 平台支持9
1.5 C#和公共语言运行时9
1.6 框架与基础类库10
1.7 遗留框架和小众框架11
1.8 Windows Runtime12
1.9 C#简史14
第2章 C#语言基础26
2.1 第一个C#程序26
2.2 语法29
2.3 类型基础32
2.4 数值类型40
2.5 布尔类型和运算符48
2.6 字符串和字符49
2.7 数组52
2.8 变量和参数57
2.9 表达式和运算符68
2.10 null运算符72
2.11 语句74
2.12 命名空间84
第3章 在C#中创建类型91
3.1 类91
3.2 继承108
3.3 object类型117
3.4 结构体120
3.5 访问权限修饰符123
3.6 接口125
3.7 枚举类型131
3.8 嵌套类型134
3.9 泛型136
第4章 C#的高级特性149
4.1 委托149
4.2 事件158
4.3 Lambda表达式164
4.4 匿名方法169
4.5 try语句和异常169
4.6 枚举类型和迭代器178
4.7 可空值类型183
4.8 可空引用类型(C# 8)188
4.9 扩展方法191
4.10 匿名类型193
4.11 元组194
4.12 模式198
4.13 特性202
4.14 调用者信息特性204
4.15 动态绑定205
4.16 运算符重载213
4.17 不安全的代码和指针216
4.18 预处理指令220
4.19 XML文档222
第5章 框架概述227
5.1 .NET Standard227
5.2 框架与C#语言版本的关系230
5.3 参考程序集231
5.4 CLR和BCL231
5.5 应用程序框架235
第6章 框架基础239
6.1 字符串与文本处理239
6.2 日期和时间252
6.3 日期和时区259
6.4 格式化和解析265
6.5 标准格式字符串与解析标记271
6.6 其他转换机制278
6.7 全球化282
6.8 操作数字283
6.9 枚举287
6.10 Guid结构体290
6.11 相等比较291
6.12 顺序比较301
6.13 实用类304
第7章 集合309
7.1 枚举309
7.2 ICollection和IList接口316
7.3 Array类320
7.4 List、Queue、Stack和Set328
7.5 字典336
7.6 自定义集合与代理342
7.7 不可变集合348
7.8 扩展相等比较和排序操作351
第8章 LINQ查询359
8.1 入门359
8.2 流式语法361
8.3 查询表达式367
8.4 延迟执行372
8.5 子查询378
8.6 构造方式381
8.7 映射方式384
8.8 解释型查询386
8.9 EF Core393
8.10 构建查询表达式404
第9章 LINQ运算符409
9.1 概述410
9.2 筛选413
9.3 映射417
9.4 连接429
9.5 排序437
9.6 分组440
9.7 集合运算符443
9.8 转换方法444
9.9 元素运算符447
9.10 聚合方法449
9.11 量词运算符453
9.12 生成序列的方法455
第10章 LINQ to XML456
10.1 架构概述456
10.2 X-DOM概述457
10.3 实例化X-DOM460
10.4 导航和查询463
10.5 更新X-DOM468
10.6 使用Value471
10.7 文档和声明474
10.8 名称和命名空间477
10.9 注解483
10.10 将数据映射到X-DOM484
第11章 其他XML与JSON技术488
11.1 XmlReader488
11.2 XmlWriter496
11.3 XmlReader/XmlWriter的使用模式498
11.4 处理JSON502
第12章 对象销毁与垃圾回收509
12.1 IDisposable接口、Dispose方法和Close方法509
12.2 自动垃圾回收514
12.3 终结器517
12.4 垃圾回收器的工作方式521
12.5 托管内存泄漏527
12.6 弱引用530
第13章 诊断534
13.1 条件编译534
13.2 Debug和Trace类537
13.3 调试器的集成541
13.4 进程与线程处理542
13.5 StackTrace和StackFrame类542
13.6 Windows事件日志544
13.7 性能计数器546
13.8 Stopwatch类551
13.9 跨平台诊断工具551
第14章 并发与异步556
14.1 概述556
14.2 线程557
14.3 任务572
14.4 异步原则580
14.5 C#的异步函数585
14.6 异步模式603
14.7 旧有的异步编程模式611
第15章 流与I/O614
15.1 流的架构614
15.2 使用流616
15.3 流适配器629
15.4 压缩流637
15.5 操作ZIP文件640
15.6 文件与操作641
15.7 在UWP中进行文件I/O操作652
15.8 操作系统安全性656
15.9 内存映射文件659
第16章 网络663
16.1 .NET网络架构663
16.2 地址与端口665
16.3 URI666
16.4 客户端类668
16.5 使用HTTP681
16.6 编写HTTP服务器685
16.7 使用FTP687
16.8 使用DNS689
16.9 通过SmtpClient类发送邮件690
16.10 使用TCP691
16.11 使用TCP接收POP3邮件694
16.12 在UWP中使用TCP696
第17章 序列化699
17.1 序列化的概念699
17.2 XML 序列化器703
17.3 JSON 序列化器712
17.4 二进制序列化器721
17.5 二进制序列化特性723
17.6 使用ISerializable接口进行二进制序列化725
第18章 程序集729
18.1 程序集的组成部分729
18.2 强名称和程序集签名733
18.3 程序集名称735
18.4 认证代码签名737
18.5 资源和附属程序集739
18.6 程序集的加载、解析与隔离747
第19章 反射和元数据768
19.1 反射和激活类型768
19.2 反射和调用成员775
19.3 反射程序集788
19.4 使用特性789
19.5 动态生成代码794
19.6 生成程序集和类型800
19.7 生成类型成员803
19.8 生成泛型方法和泛型类型809
19.9 复杂的生成目标811
19.10 解析IL814
第20章 动态编程820
20.1 动态语言运行时820
20.2 数值类型统一822
20.3 动态成员重载解析823
20.4 实现动态对象828
20.5 与动态语言进行互操作832
第21章 加密834
21.1 概述834
21.2 Windows数据保护835
21.3 散列算法836
21.4 对称加密837
21.5公钥加密和签名842
第22章 高级线程处理846
22.1 同步概述846
22.2 排他锁847
22.3 锁和线程安全性855
22.4 非排他锁860
22.5 使用事件等待句柄发送信号866
22.6 Barrier类874
22.7 延迟初始化875
22.8 线程本地存储877
22.9 定时器881
第23章 并行编程885
23.1 选择PFX的原因885
23.2 PLINQ888
23.3 Parallel类900
23.4 任务并行907
23.5 处理AggregateException916
23.6 并发集合919
23.7 BlockingCollection类922
第24章 Span和Memory926
24.1 Span和切片927
24.2 Memory类930
24.3 前向枚举器931
24.4 操作栈分配内存和非托管内存933
第25章 原生程序和COM组件互操作性935
25.1 调用原生DLL935
25.2 类型的封送936
25.3 非托管代码中的回调函数940
25.4 模拟C共用体941
25.5 共享内存942
25.6 将结构体映射到非托管内存944
25.7 COM互操作性948
25.8 在C#中调用COM组件950
25.9 内嵌互操作类型953
25.10 在COM中访问C#对象954
第26章 正则表达式956
26.1 正则表达式基础956
26.2 量词符号961
26.3 零宽度断言962
26.4 分组965
26.5 替换并分割文本966
26.6 正则表达式实例968
26.7 正则表达式语言参考971
第27章 Roslyn编译器975
27.1 Roslyn架构975
27.2 语法树976
27.3 编译过程和语义模型991
作者介绍
封面介绍



---------------------------8050831 - C#从现象到本质---------------------------


引 言
第一部分 基础知识
第1章 .NET基础知识 2
1.1 .NET框架介绍 2
1.2 .NET框架发展史 3
1.3 .NET框架的主要成员 5
1.3.1 两步编译与跨平台 5
1.3.2 CLR 6
1.3.3 CLI 7
1.3.4 CTS和CLS 8
1.3.5 框架类库(FCL) 8
1.3.6 基础类库(BCL) 9
1.4 程序集 10
1.4.1 反向工程—使用ILSpy观察IL 10
1.4.2 程序集与托管模块 11
1.4.3 程序集的部署 18
1.5 .NET程序的编译:IL与JIT 20
1.5.1 什么是IL(CIL) 21
1.5.2 初识IL 21
1.5.3 System.Reflection.Emit 31
1.5.4 即时编译(JIT) 33
1.5.5 运行时的验证 34
1.5.6 Visual Studio的编译模式与本地代码的优化 34
1.5.7 托管代码与非托管代码的互操作性 35
1.6 CLR启动与Hello World的运行 36
1.7 本章小结 37
1.8 思考题 37
第2章 C#类型基础(上) 38
2.1 公共类型系统 38
2.2 堆与栈 40
2.2.1 堆 40
2.2.2 栈 41
2.3 引用类型的内存分配 42
2.3.1 字段的对齐 44
2.3.2 同步块索引 45
2.3.3 方法表指针和类型对象 45
2.3.4 静态字段和属性 46
2.4 使用WinDbg探查内存 46
2.4.1 WinDbg简易命令速查 47
2.4.2 使用WinDbg探查引用类型 47
2.4.3 引用类型的复制 52
2.5 值类型 53
2.5.1 基元类型 54
2.5.2 值类型的内存分配 54
2.5.3 值类型的构造函数 56
2.5.4 何时考虑使用值类型 57
2.5.5 值类型是密封的 58
2.5.6 值类型和引用类型的区别与联系 58
2.5.7 嵌套:值类型与引用类型 58
2.6 装箱和拆箱 59
2.6.1 装箱的过程 59
2.6.2 拆箱的过程 60
2.6.3 如何避免拆箱和装箱 60
2.7 本章小结 61
2.8 思考题 61
第3章 C#类型基础(下) 62
3.1 类型的非方法成员 62
3.1.1 常量 62
3.1.2 字段 63
3.1.3 无参属性 64
3.1.4 有参属性 66
3.1.5 属性的意义 67
3.2 类型的构造函数和析构函数 67
3.2.1 静态类 67
3.2.2 实例构造函数(引用类型) 68
3.2.3 实例构造函数(值类型) 69
3.2.4 静态构造函数 69
3.2.5 构造函数的执行顺序 70
3.2.6 析构函数 71
3.3 类型的普通方法成员 72
3.3.1 方法表 73
3.3.2 使用WinDbg探查方法表 73
3.3.3 方法槽表与方法描述表在JIT前后的变化 75
3.3.4 方法调用 77
3.3.5 方法参数的按值传递和按引用传递 80
3.4 类型转换 82
3.4.1 将一个对象转换为它的基类型 83
3.4.2 将一个对象转换为它的派生类型 84
3.4.3 基元类型的类型转换 84
3.4.4 自定义类型转换 84
3.5 System.Object类型的主要方法 85
3.6 本章小结 90
3.7 思考题 91
第4章 C#和面向对象 92
4.1 面向对象程序设计 92
4.2 继承 93
4.2.1 方法表与继承 94
4.2.2 再论Call与Callvirt 94
4.2.3 IL中修饰方法的关键字 95
4.2.4 方法的重载、重写和隐藏 96
4.2.5 值类型的方法调用 100
4.3 接口和多态 101
4.3.1 抽象类与Is A关系 102
4.3.2 接口与Has A关系 102
4.3.3 显式接口实现 103
4.3.4 显式接口实现与泛型接口 104
4.3.5 抽象类VS接口 105
4.3.6 接口不继承自Object 106
4.3.7 接口方法分派 106
4.4 面向对象编程五大原则(SOLID) 106
4.4.1 单一职责原则 107
4.4.2 开闭原则 107
4.4.3 里氏代换原则 111
4.4.4 接口隔离原则 111
4.4.5 依赖倒转原则 112
4.5 本章小结 112
4.6 思考题 113
第5章 字符串 114
5.1 字符 114
5.2 字符串的特性 115
5.2.1 字符串与普通的引用类型相比 116
5.2.2 IL中创建字符串 116
5.2.3 字符串的不变性 117
5.2.4 通过成员来证明不变性 118
5.2.5 为什么要这么设计 119
5.3 字符串驻留 119
5.4 字符串的相加 121
5.5 不变性只是针对托管代码 124
5.6 本章小结 125
5.7 思考题 125
第6章 垃圾回收 126
6.1 垃圾回收的概念 127
6.1.1 GC堆的构造 127
6.1.2 识别垃圾 128
6.1.3 压缩 136
6.1.4 C#的GC规则总结 136
6.2 垃圾回收策略 136
6.2.1 Dispose方法和IDisposible接口 136
6.2.2 析构函数(终结器) 137
6.2.3 如何回收托管资源 140
6.2.4 如何回收非托管资源 142
6.2.5 using关键字 143
6.2.6 总结:怎样实现垃圾回收策略 144
6.3 GC的工作模式 145
6.3.1 工作站模式 145
6.3.2 服务器模式 146
6.4 大对象 146
6.5 本章小结 147
6.6 思考题 147
第7章 异常与异常处理 148
7.1 C#的异常处理 149
7.1.1 try 149
7.1.2 catch 149
7.1.3 finally 150
7.1.4 结构化异常处理 152
7.1.5 throw和throw ex 153
7.2 IL中的异常处理机制 155
7.3 开发中的异常处理 159
7.3.1 提高程序的健壮性 159
7.3.2 使用.NET自带的日志类型 159
7.4 本章小结 163
7.5 思考题 163
第二部分 C#特性
第8章 委托和事件 166
8.1 委托 166
8.1.1 委托初探 166
8.1.2 使用委托达到代码复用的目的 168
8.1.3 委托的协变和逆变 171
8.1.4 委托的本质 171
8.1.5 委托链与多路广播 174
8.1.6 委托的异步调用 176
8.2 事件 176
8.2.1 事件初探 177
8.2.2 事件的本质 180
8.2.3 Winform中的经典事件:单击按钮 182
8.2.4 Windows消息机制简介 183
8.2.5 观察者模式 185
8.3 本章小结 189
8.4 思考题 189
第9章 泛型 190
9.1 泛型方法 190
9.1.1 类型安全与代码爆炸 191
9.1.2 泛型类型的静态成员 193
9.1.3 泛型与继承 194
9.1.4 泛型约束 194
9.1.5 泛型委托 195
9.1.6 使用泛型委托达到代码复用的目的 196
9.2 可空类型 197
9.3 协变和逆变 200
9.3.1 可变性 200
9.3.2 通过反射调用泛型方法 207
9.4 本章小结 208
9.5 思考题 208
第10章 反射 209
10.1 初识反射 209
10.1.1 获得类型的基本信息 210
10.1.2 获得类型成员和方法调用 211
10.1.3 加载程序集(晚期绑定) 215
10.1.4 反射与泛型 216
10.2 反射的应用场景 218
10.3 反射的性能问题 218
10.3.1 方法反射调用有多慢 218
10.3.2 通过其他方法优化反射调用方式 220
10.3.3 反射优化的性能比较 225
10.4 反射的应用:一个简单的ORM 225
10.4.1 通过反射和特性建立表格和实体的联系 226
10.4.2 为实体增加主键 227
10.4.3 建立本地数据库 228
10.4.4 建立表格 228
10.4.5 删除表格 231
10.4.6 为表格插入数据 231
10.4.7 选择数据 233
10.4.8 多表联查怎么办 234
10.4.9 优化ORM:使用委托来获得值 235
10.4.10 完整的实现代码 235
10.4.11 小结 242
10.5 本章小结 242
10.6 思考题 243
第11章 C#的数据结构 244
11.1 IEnumerable 244
11.1.1 迭代器模式 244
11.1.2 什么是IEnumerable 245
11.1.3 实现一个继承IEnumerable的类型 245
11.1.4 yield的延迟执行特性 256
11.1.5 IEnumerable是一个可枚举序列,但不是容器 257
11.1.6 在迭代的过程中改变集合的状态 259
11.1.7 IEnumerable的缺点和总结 259
11.2 IEnumerable的派生类 260
11.2.1 Array 260
11.2.2 ArrayList 261
11.2.3 IDictionary 262
11.3 IEnumerable的派生类 272
11.3.1 IList 272
11.3.2 LinkedList 272
11.3.3 Queue 281
11.3.4 Stack 283
11.3.5 IDictionary 284
11.3.6 ISet 287
11.4 常用数据结构特征以及操作时间复杂度 288
11.5 如何选择数据结构 289
11.6 本章小结 289
11.7 思考题 290
第12章 LINQ的准备工作 291
12.1 匿名函数、捕获变量与闭包 291
12.1.1 匿名函数 291
12.1.2 演示捕获变量 293
12.1.3 闭包 300
12.2 LINQ的准备工作 301
12.2.1 自动实现的属性 302
12.2.2 隐式类型的局部变量 302
12.2.3 匿名类型 303
12.2.4 扩展方法 305
12.3 Lambda表达式和表达式树 306
12.3.1 从匿名函数到Lambda表达式 306
12.3.2 表达式简介 308
12.3.3 构建简单的表达式树 309
12.3.4 表达式树与反射 311
12.4 本章小结 315
12.5 思考题 315
第13章 LINQ to Object 316
13.1 LINQPad 316
13.2 Enumerable是什么 318
13.3 使用Northwind数据源演示查询操作 318
13.4 投影操作符与过滤操作符 318
13.4.1 Select整个表 318
13.4.2 Select部分列 319
13.4.3 Select结合Lambda表达式 320
13.4.4 使用where进行过滤 320
13.4.5 SelectMany 321
13.4.6 Distinct 324
13.5 排序操作符 325
13.6 分组操作符 325
13.7 通过Let声明局部变量 328
13.8 连接操作符 329
13.8.1 使用join子句的内连接 330
13.8.2 使用join into子句进行外连接 330
13.9 其他常用的操作符 331
13.10 延迟执行 333
13.11 查询表达式和方法语法 335
13.12 本章小结 336
13.13 思考题 336
第14章 LINQ to SQL 337
14.1 IQueryable 337
14.2 IQueryable与 IEnumerable的异同 338
14.3 数据库操作 339
14.3.1 弱类型实体集 339
14.3.2 Entity Framework 340
14.3.3 Repository模式 342
14.4 使用LINQ to Entity Framework 342
14.4.1 Database First 342
14.4.2 Model First 346
14.4.3 Code First 347
14.5 表达式树转化为SQL 348
14.5.1 准备工作 349
14.5.2 实现IQueryable 351
14.5.3 实现IQueryProvider 352
14.5.4 测试IQueryable的运行流程 354
14.5.5 表达式查看器 355
14.5.6 第一步:解析Where表达式 355
14.5.7 第二步:解析Where Lambda表达式 357
14.5.8 表达式树转化为SQL的总结 360
14.6 LINQ与EF的性能问题 361
14.6.1 避免Select N+1 361
14.6.2 避免重复枚举同一序列 362
14.6.3 避免毫无必要地枚举整个序列 363
14.6.4 Entity Framework的预热 364
14.6.5 AsNoTracking方法 365
14.6.6 简化传入字符串排序的代码 365
14.7 LINQ to Rx 370
14.7.1 事件流序列操作LINQ化 371
14.7.2 事件的限流 372
14.7.3 本质:推模型和拉模型 373
14.8 本章小结 373
14.9 思考题 374
第15章 动态语言运行时 375
15.1 dynamic关键字简介 375
15.1.1 动态类型简化晚期绑定 376
15.1.2 动态类型简化COM互操作 378
15.1.3 动态类型相比泛型更加灵活 379
15.1.4 使用ExpandoObject创建动态类型 380
15.1.5 动态类型的好处 381
15.1.6 动态类型的限制 381
15.2 动态类型的原理 382
15.2.1 调用点 382
15.2.2 使用C# object类型模拟动态类型 383
15.2.3 建立调用点 384
15.2.4 初始化调用点 384
15.2.5 使用调用点的目标 385
15.2.6 DLR的缓存策略 386
15.3 本章小结 387
15.4 思考题 387
第16章 C# 6与C# 7的重要特性 388
16.1 C# 6的主要特性 388
16.1.1 自动属性的再次进化 388
16.1.2 简易函数表达式写法 390
16.1.3 字符串插值 392
16.1.4 使用static using调用静态类方法 392
16.1.5 判定null的简写操作符. 393
16.1.6 异常过滤 394
16.1.7 nameof运算符 394
16.2 C# 7的主要特性 395
16.2.1 数字字面量 395
16.2.2 改进的out关键字 396
16.2.3 模式匹配 397
16.2.4 C# 7的值类型元组 399
16.2.5 解构 402
16.2.6 局部函数 405
16.2.7 引用返回值和引用局部变量 410
16.2.8 更多的表达式体成员 414
16.2.9 在更多的地方抛出异常 415
16.2.10 具有值类型的引用语义 415
16.3 C# 8前瞻 416
16.4 本章小结 417
16.5 思考题 417
第三部分 多线程和异步
第17章 多线程概念 420
17.1 进程和线程 420
17.1.1 操作系统简单发展史 420
17.1.2 进程 421
17.1.3 进程调度 424
17.1.4 进程的上下文切换 424
17.1.5 线程 425
17.1.6 单核CPU多线程是否能够提高性能 428
17.2 .NET中的进程与应用程序域 428
17.2.1 .NET中的进程(托管进程) 428
17.2.2 进程间通信 428
17.2.3 使用剪贴板实现进程间通信 429
17.2.4 应用程序域 431
17.3 .NET中的线程(托管线程)与Thread类的基本使用 432
17.3.1 创建线程 433
17.3.2 线程命名 433
17.3.3 前台线程和后台线程 434
17.3.4 线程的状态 435
17.3.5 向线程传递数据 437
17.3.6 异常处理 438
17.4 线程池 439
17.4.1 线程池是如何管理线程的 439
17.4.2 线程池的线程调度策略 440
17.4.3 使用线程池:显式操作 441
17.4.4 使用线程池:异步委托 442
17.4.5 使用线程池:通过任务 442
17.5 线程局部存储区(TLS) 443
17.5.1 使用[ThreadStatic]特性 443
17.5.2 使用Thread类上的两个方法:GetData和SetData 444
17.5.3 使用ThreadLocal 445
17.6 本章小结 446
17.7 思考题 447
第18章 多线程同步 448
18.1 多线程同步的概念 448
18.2 锁:基元构造 455
18.3 用户模式构造 456
18.3.1 同步问题的提出 456
18.3.2 JIT优化、有序性和指令重排 457
18.3.3 C#的内存模型 459
18.3.4 可见性、有序性、内存栅栏与volatile关键字 460
18.3.5 避免使用volatile 464
18.3.6 互锁构造 465
18.3.7 Interlocked Anything模式 466
18.3.8 使用用户模式构造的例子 467
18.3.9 实现自旋锁 468
18.3.10 SpinLock 469
18.4 内核模式构造 470
18.4.1 通过WaitHandle操作内核对象 471
18.4.2 事件构造 472
18.4.3 信号量构造 477
18.4.4 使用信号量实现锁 478
18.4.5 互斥量构造 478
18.4.6 基元构造锁总结 479
18.5 锁:混合构造 480
18.5.1 一个简单的混合锁 481
18.5.2 优化DIY混合锁:使锁支持递归和自旋 482
18.5.3 最常用的锁:Monitor的工作原理 484
18.5.4 Monitor的递归调用 485
18.5.5 如何选择同步对象 486
18.6 .NET 4中新增的轻量级同步工具 488
18.6.1 ManualResetEventSlim和SemaphoreSlim类 489
18.6.2 ReaderWriterLockSlim类 489
18.7 这么多锁:总结 491
18.8 线程安全的集合类 491
18.9 本章小结 494
18.10 思考题 494
第19章 .NET 4之前的异步编程 495
19.1 基本概念 495
19.2 使用System.Threading进行异步编程 497
19.2.1 耗时任务 497
19.2.2 最简单的异步编程 497
19.2.3 获得执行结果 498
19.2.4 实现回调函数获得执行结果 499
19.2.5 线程统一取消模型 500
19.2.6 总结 504
19.3 基于委托的异步编程模型 505
19.3.1 APM的设计规范 505
19.3.2 获得异步委托的执行结果 506
19.3.3 System.IAsyncResult接口 507
19.3.4 通过回调的方式获得异步委托的执行结果 508
19.3.5 使用线程统一取消模型进行取消 509
19.3.6 捕获异步编程的异常 511
19.3.7 GUI的线程处理模型 512
19.3.8 GUI中使用委托进行异步—Control.Begin-Invoke原理 513
19.3.9 GUI中使用委托进行异步—WinForm程序示例 515
19.3.10 总结 517
19.4 基于事件的异步编程模式 518
19.4.1 EAP的设计规范 518
19.4.2 BackgroundWorker类简介 519
19.4.3 GUI中使用EAP进行异步—WPF程序示例 521
19.4.4 总结 525
19.5 我们需要这么多异步编程的方法吗 525
19.6 本章小结 525
19.7 思考题 526
第20章 任务并行库 527
20.1 任务并行库 527
20.2 使用任务进行异步编程 528
20.2.1 新建任务 528
20.2.2 任务的状态 529
20.2.3 任务调度器 530
20.2.4 任务工厂 531
20.3 获得任务的执行结果 532
20.3.1 等待任务完成 532
20.3.2 任务连接作为回调函数 533
20.3.3 使用过去的方式 539
20.4 任务的异常处理 539
20.4.1 父子任务中的异常处理(附加子任务) 541
20.4.2 父子任务中的异常处理(分离子任务) 541
20.5 任务的取消 544
20.5.1 直接退出任务 544
20.5.2 利用ThrowIfCancellation-Requested方法545
20.5.3 任务取消的异常处理 545
20.5.4 任务异常处理:总结 548
20.6 在WPF中使用任务 549
20.7 并行编程与PLINQ 552
20.8 Parallel类 553
20.8.1 Parallel.Invoke与任务并行 554
20.8.2 Parallel.For/ForEach与数据并行 555
20.8.3 收集任务的执行结果 558
20.8.4 指定最大并行度 558
20.8.5 在Parallel类中捕捉异常 559
20.8.6 使用ParallelOption取消并行任务 560
20.8.7 使用ParallelLoopState退出For/ForEach循环 562
20.8.8 Parallel方法的取消与异常处理总结 563
20.9 PLINQ 564
20.9.1 指定执行模式 566
20.9.2 指定并行度 567
20.9.3 PLINQ与排序 567
20.9.4 PLINQ的数据分区策略 568
20.9.5 PLINQ的输出端与结果收集策略 571
20.9.6 使用Aggregate的并行版本进行计算 572
20.9.7 取消PLINQ查询 572
20.9.8 在PLINQ中捕捉异常 573
20.9.9 总结:是否需要使用PLINQ 574
20.10 Lazy和延迟初始化 574
20.11 本章小结 576
20.12 思考题 576
第21章 .NET 4.5异步编程实例 577
21.1 初识async/await 577
21.1.1 异步方法的执行流程 579
21.1.2 异步方法的异常处理 582
21.1.3 异步方法的取消 584
21.1.4 调用方法获得结果的几种方式 585
21.1.5 async和await总结 587
21.2 了解async/await的原理 588
21.2.1 示例程序 588
21.2.2 使用ILSpy反编译 589
21.2.3 状态机结构 589
21.2.4 骨架方法 594
21.2.5 异常处理 595
21.3 GUI:使用async和await关键字进行异步操作 595
21.3.1 异步操作的基本模型 596
21.3.2 使用WhenAll等待一组任务完成 597
21.3.3 使用WhenAny等待任意一个任务完成 598
21.3.4 任务完成时的处理 599
21.4 可等待模式 600
21.4.1 定义 600
21.4.2 await anything 601
21.5 本章小结 603
21.6 思考题 604
后记 605
附录 程序员面试流程概览 606

推荐

车牌查询
桂ICP备20004708号-3