第Ⅰ部分 C#语言 2
第1章 .NET应用程序体系结构 2
1.1 选择技术 2
1.2 回顾.NET历史 3
1.2.1 C#1.0——一种新语言 3
1.2.2 带有泛型的C#2和.NET 2 5
1.2.3 .NET 3.0——Windows Presentation Foundation 5
1.2.4 C#3和.NET 3.5 ——LINQ 5
1.2.5 C#4和.NET4.0——dynamic和TPL 6
1.2.6 C#5和异步编程 6
1.2.7 C#6和.NET Core 7
1.2.8 选择技术,继续前进 8
1.3 .NET2015 8
1.3.1 .NET Framework 4.6 9
1.3.2.NET Core 1.0 10
1.3.3 程序集 11
1.3.4 NuGet包 12
1.3.5 公共语言运行库 13
1.3.6.NET Native 14
1.3.7 Windows运行库 14
1.4 Hello,World 15
1.5 用.NET4.6编译 16
1.6 用.NET Core CLI编译 17
1.6.1 设置环境 18
1.6.2 构建应用程序 18
1.6.3 打包和发布应用程序 21
1.7 应用程序类型和技术 22
1.7.1 数据访问 22
1.7.2 Windows桌面应用程序 23
1.7.3 UWP 24
1.7.4 SOAP服务和WCF 24
1.7.5 Web服务和ASP.NETWeb API 24
1.7.6 WebHooks和SignalR 25
1.7.7 Windows服务 25
1.7.8 Web应用程序 25
1.7.9 Microsoft Azure 26
1.8 开发工具 27
1.8.1 Visual Studio Community 27
1.8.2 Visual Studio Professionalwith MSDN 27
1.8.3 Visual Studio Enterprise with MSDN 27
1.8.4 Visual Studio Code 28
1.9 小结 28
第2章 核心C# 29
2.1 C#基础 30
2.2 用Visual Studio创建Hello,World! 30
2.2.1 创建解决方案 30
2.2.2 创建新项目 31
2.2.3 编译和运行程序 33
2.2.4 代码的详细介绍 35
2.3 变量 36
2.3.1 初始化变量 37
2.3.2 类型推断 38
2.3.3 变量的作用域 39
2.3.4 常量 41
2.4 预定义数据类型 41
2.4.1 值类型和引用类型 42
2.4.2.NET类型 43
2.4.3 预定义的值类型 43
2.4.4 预定义的引用类型 46
2.5 程序流控制 48
2.5.1 条件语句 48
2.5.2 循环 51
2.5.3 跳转语句 55
2.6 枚举 55
2.7 名称空间 57
2.7.1 using语句 58
2.7.2 名称空间的别名 59
2.8 Main()方法 60
2.9 使用注释 61
2.9.1 源文件中的内部注释 61
2.9.2 XML文档 62
2.10 C#预处理器指令 63
2.10.1 #define和#undef 63
2.10.2 #if、#elif、#else和#endif 64
2.10.3 #warning和#error 65
2.10.4 #region和#endregion 65
2.10.5 #line 65
2.10.6 #pragma 65
2.11 C#编程准则 66
2.11.1 关于标识符的规则 66
2.11.2 用法约定 67
2.12 小结 70
第3章 对象和类型 71
3.1 创建及使用类 72
3.2 类和结构 72
3.3 类 73
3.3.1 字段 73
3.3.2 属性 74
3.3.3 方法 76
3.3.4 构造函数 81
3.3.5 只读成员 85
3.3.6 只读字段 85
3.4 匿名类型 88
3.5 结构 89
3.5.1 结构是值类型 90
3.5.2 结构和继承 91
3.5.3 结构的构造函数 91
3.6 按值和按引用传递参数 91
3.6.1 ref参数 92
3.6.2 out参数 93
3.7 可空类型 94
3.8 枚举 95
3.9 部分类 97
3.10 扩展方法 99
3.11 Object类 100
3.12 小结 101
第4章 继承 102
4.1 继承 102
4.2 继承的类型 102
4.2.1 多重继承 103
4.2.2 结构和类 103
4.3 实现继承 103
4.3.1 虚方法 104
4.3.2 多态性 106
4.3.3 隐藏方法 107
4.3.4 调用方法的基类版本 108
4.3.5 抽象类和抽象方法 109
4.3.6 密封类和密封方法 110
4.3.7 派生类的构造函数 110
4.4 修饰符 112
4.4.1 访问修饰符 113
4.4.2 其他修饰符 113
4.5 接口 114
4.5.1 定义和实现接口 115
4.5.2 派生的接口 118
4.6 is和as运算符 120
4.7 小结 121
第5章 托管和非托管的资源 122
5.1 资源 122
5.2 后台内存管理 123
5.2.1 值数据类型 123
5.2.2 引用数据类型 125
5.2.3 垃圾回收 127
5.3 强引用和弱引用 129
5.4 处理非托管的资源 130
5.4.1 析构函数或终结器 130
5.4.2 IDisposable接口 131
5.4.3 using语句 132
5.4.4 实现IDisposable接口和析构函数 133
5.4.5 IDisposable和终结器的规则 134
5.5 不安全的代码 135
5.5.1 用指针直接访问内存 135
5.5.2 指针示例:PointerPlayground 143
5.5.3 使用指针优化性能 147
5.6 平台调用 150
5.7 小结 154
第6章 泛型 155
6.1 泛型概述 155
6.1.1 性能 156
6.1.2 类型安全 157
6.1.3 二进制代码的重用 157
6.1.4 代码的扩展 158
6.1.5 命名约定 158
6.2 创建泛型类 158
6.3 泛型类的功能 162
6.3.1 默认值 163
6.3.2 约束 163
6.3.3 继承 166
6.3.4 静态成员 167
6.4 泛型接口 167
6.4.1 协变和抗变 168
6.4.2 泛型接口的协变 169
6.4.3 泛型接口的抗变 170
6.5 泛型结构 171
6.6 泛型方法 173
6.6.1 泛型方法示例 174
6.6.2 带约束的泛型方法 175
6.6.3 带委托的泛型方法 176
6.6.4 泛型方法规范 176
6.7 小结 178
第7章 数组和元组 179
7.1 同一类型和不同类型的多个对象 179
7.2 简单数组 180
7.2.1 数组的声明 180
7.2.2 数组的初始化 180
7.2.3 访问数组元素 181
7.2.4 使用引用类型 182
7.3 多维数组 183
7.4 锯齿数组 184
7.5 Array类 185
7.5.1 创建数组 185
7.5.2 复制数组 186
7.5.3 排序 187
7.6 数组作为参数 190
7.6.1 数组协变 190
7.6.2 ArraySegment<T> 191
7.7 枚举 191
7.7.1 IEnumerator接口 192
7.7.2 foreach语句 192
7.7.3 yield语句 193
7.8 元组 197
7.9 结构比较 198
7.10 小结 201
第8章 运算符和类型强制转换 202
8.1 运算符和类型转换 202
8.2 运算符 203
8.2.1 运算符的简化操作 204
8.2.2 运算符的优先级和关联性 212
8.3 类型的安全性 213
8.3.1 类型转换 213
8.3.2 装箱和拆箱 217
8.4 比较对象的相等性 218
8.4.1 比较引用类型的相等性 218
8.4.2 比较值类型的相等性 219
8.5 运算符重载 219
8.5.1 运算符的工作方式 220
8.5.2 运算符重载的示例:Vector结构 221
8.5.3 比较运算符的重载 225
8.5.4 可以重载的运算符 227
8.6 实现自定义的索引运算符 228
8.7 实现用户定义的类型强制转换 230
8.7.1 实现用户定义的类型强制转换 231
8.7.2 多重类型强制转换 237
8.8 小结 240
第9章 委托、lambda表达式和事件 241
9.1 引用方法 241
9.2 委托 242
9.2.1 声明委托 242
9.2.2 使用委托 243
9.2.3 简单的委托示例 246
9.2.4 Action<T>和Func<T>委托 248
9.2.5 BubbleSorter示例 248
9.2.6 多播委托 251
9.2.7 匿名方法 254
9.3 lambda表达式 255
9.3.1 参数 256
9.3.2 多行代码 256
9.3.3 闭包 257
9.4 事件 258
9.4.1 事件发布程序 258
9.4.2 事件侦听器 260
9.4.3 弱事件 261
9.5 小结 263
第10章 字符串和正则表达式 264
10.1 System.String类 265
10.1.1 构建字符串 266
10.1.2 StringBuilder成员 269
10.2 字符串格式 270
10.2.1 字符串插值 270
10.2.2 日期时间和数字的格式 272
10.2.3 自定义字符串格式 274
10.3 正则表达式 275
10.3.1 正则表达式概述 275
10.3.2 RegularExpressionsPlayaround示例 276
10.3.3 显示结果 279
10.3.4 匹配、组和捕获 280
10.4 小结 283
第11章 集合 284
11.1 概述 284
11.2 集合接口和类型 285
11.3 列表 285
11.3.1 创建列表 287
11.3.2 只读集合 294
11.4 队列 294
11.5 栈 298
11.6 链表 300
11.7 有序列表 305
11.8 字典 306
11.8.1 字典初始化器 307
11.8.2 键的类型 307
11.8.3 字典示例 308
11.8.4 Lookup类 312
11.8.5 有序字典 313
11.9 集 313
11.10 性能 315
11.11 小结 316
第12章 特殊的集合 317
12.1 概述 317
12.2 处理位 317
12.2.1 BitArray类 318
12.2.2 BitVector32结构 320
12.3 可观察的集合 323
12.4 不变的集合 324
12.4.1 使用构建器和不变的集合 327
12.4.2 不变集合类型和接口 327
12.4.3 使用LINQ和不变的数组 328
12.5 并发集合 328
12.5.1 创建管道 329
12.5.2 使用BlockingCollection 332
12.5.3 使用Concurrent-Dictionary 333
12.5.4 完成管道 334
12.6 小结 335
第13章 LINQ 337
13.1 LINQ概述 337
13.1.1 列表和实体 338
13.1.2 LINQ查询 341
13.1.3 扩展方法 342
13.1.4 推迟查询的执行 343
13.2 标准的查询操作符 345
13.2.1 筛选 347
13.2.2 用索引筛选 347
13.2.3 类型筛选 348
13.2.4 复合的from子句 348
13.2.5 排序 349
13.2.6 分组 350
13.2.7 LINQ查询中的变量 351
13.2.8 对嵌套的对象分组 352
13.2.9 内连接 353
13.2.10 左外连接 355
13.2.11 组连接 355
13.2.12 集合操作 358
13.2.13 合并 360
13.2.14 分区 360
13.2.15 聚合操作符 362
13.2.16 转换操作符 363
13.2.17 生成操作符 365
13.3 并行LINQ 365
13.3.1 并行查询 365
13.3.2 分区器 366
13.3.3 取消 367
13.4 表达式树 367
13.5 LINQ提供程序 370
13.6 小结 371
第14章 错误和异常 372
14.1 简介 372
14.2 异常类 373
14.3 捕获异常 374
14.3.1 实现多个catch块 377
14.3.2 在其他代码中捕获异常 380
14.3.3 System.Exception属性 380
14.3.4 异常过滤器 381
14.3.5 重新抛出异常 382
14.3.6 没有处理异常时发生的情况 386
14.4 用户定义的异常类 386
14.4.1 捕获用户定义的异常 387
14.4.2 抛出用户定义的异常 389
14.4.3 定义用户定义的异常类 392
14.5 调用者信息 394
14.6 小结 396
第15章 异步编程 397
15.1 异步编程的重要性 397
15.2 异步模式 398
15.2.1 同步调用 405
15.2.2 异步模式 406
15.2.3 基于事件的异步模式 407
15.2.4 基于任务的异步模式 408
15.3 异步编程的基础 410
15.3.1 创建任务 410
15.3.2 调用异步方法 411
15.3.3 延续任务 411
15.3.4 同步上下文 412
15.3.5 使用多个异步方法 412
15.3.6 转换异步模式 413
15.4 错误处理 414
15.4.1 异步方法的异常处理 415
15.4.2 多个异步方法的异常处理 415
15.4.3 使用AggregateException信息 416
15.5 取消 417
15.5.1 开始取消任务 417
15.5.2 使用框架特性取消任务 417
15.5.3 取消自定义任务 418
15.6 小结 419
第16章 反射、元数据和动态编程 420
16.1 在运行期间检查代码和动态编程 420
16.2 自定义特性 421
16.2.1 编写自定义特性 422
16.2.2 自定义特性示例:WhatsNewAttributes 425
16.3 反射 428
16.3.1 System.Type类 428
16.3.2 TypeView示例 430
16.3.3 Assembly类 433
16.3.4 完成WhatsNewAttributes示例 434
16.4 为反射使用动态语言扩展 438
16.4.1 创建Calculator库 438
16.4.2 动态实例化类型 440
16.4.3 用反射API调用成员 442
16.4.4 使用动态类型调用成员 442
16.5 dynamic类型 443
16.6 DLR 448
16.7 包含DLR ScriptRuntime 449
16.8 DynamicObject和ExpandoObject 451
16.8.1 DynamicObject 451
16.8.2 ExpandoObject 453
16.9 小结 455
第Ⅱ部分 .NET Core与Windows Runtime 458
第17章 Visual Studio 201 5 458
17.1 使用Visual Studio 2015 458
17.1.1 Visual Studio的版本 461
17.1.2 Visual Studio设置 461
17.2 创建项目 462
17.2.1 面向多个版本的.NET Framework 463
17.2.2 选择项目类型 464
17.3 浏览并编写项目 469
17.3.1 构建环境:CLI和MSBuild 469
17.3.2 Solution Explorer 470
17.3.3 使用代码编辑器 477
17.3.4 学习和理解其他窗口 481
17.3.5 排列窗口 485
17.4 构建项目 485
17.4.1 构建、编译和生成代码 486
17.4.2 调试版本和发布版本 486
17.4.3 选择配置 488
17.4.4 编辑配置 488
17.5 调试代码 490
17.5.1 设置断点 490
17.5.2 使用数据提示和调试器可视化工具 491
17.5.3 Live Visual Tree 492
17.5.4 监视和修改变量 493
17.5.5 异常 494
17.5.6 多线程 495
17.6 重构工具 495
17.7 体系结构工具 497
17.7.1 代码地图 498
17.7.2 层关系图 499
17.8 分析应用程序 500
17.8.1 诊断工具 500
17.8.2 Concurrency Visualizer 504
17.8.3 代码分析器 505
17.8.4 Code Metrics 506
17.9 小结 506
第18章 .NET编译器平台 507
18.1 简介 507
18.2 编译器管道 509
18.3 语法分析 509
183.1 使用查询节点 515
18.3.2 遍历节点 517
18.4 语义分析 519
18.4.1 编译 520
18.4.2 语义模型 521
18.5 代码转换 522
18.5.1 创建新树 522
18.5.2 使用语法重写器 524
18.6 Visual Studio Code重构 529
18.6.1 VSIX包 529
18.6.2 代码重构提供程序 532
18.7 小结 537
第19章 测试 538
19.1 概述 538
19.2 使用MSTest进行单元测试 539
19.2.1 使用MSTest创建单元测试 539
19.2.2 运行单元测试 541
19.2.3 使用MSTest预期异常 543
19.2.4 测试全部代码路径 544
19.2.5 外部依赖 544
19.2.6 Fakes Framework 547
19.2.7 IntelliTest 549
19.3 使用xUnit进行单元测试 549
19.3.1 使用xUnit和.NETCore 550
19.3.2 创建Fact属性 550
19.3.3 创建Theory属性 551
19.3.4 用dotnet工具运行单元测试 552
19.3.5 使用Mocking库 552
19.4 UI测试 556
19.5 Web测试 559
19.5.1 创建Web测试 560
19.5.2 运行Web测试 562
19.5.3 Web负载测试 563
19.6 小结 565
第20章 诊断和Application Insights 566
20.1 诊断概述 566
20.2 使用EventSource跟踪 567
20.2.1 EventSource的简单用法 568
20.2.2 跟踪工具 570
20.2.3 派生自EventSource 572
20.2.4 使用注释和EventSource 574
20.2.5 创建事件清单模式 576
20.2.6 使用活动ID 578
20.3 创建自定义侦听器 581
20.4 使用Application Insights 582
20.4.1 创建通用Windows应用程序 583
20.4.2 创建Application Insights资源 583
20.4.3 配置Windows应用程序 584
20.4.4 使用收集器 586
20.4.5 编写自定义事件 587
20.5 小结 588
第21章 任务和并行编程 590
21.1 概述 590
21.2 Parallel类 591
21.2.1 使用Parallel.For()方法循环 591
21.2.2 提前停止Parallel.For 594
21.2.3 Parallel.For()的初始化 595
21.2.4 使用Parallel.ForEach()方法循环 596
21.2.5 通过Parallel.Invoke()方法调用多个方法 597
21.3 任务 597
21.3.1 启动任务 597
21.3.2 Future——任务的结果 600
21.3.3 连续的任务 601
21.3.4 任务层次结构 602
21.3.5 从方法中返回任务 603
21.3.6 等待任务 603
21.4 取消架构 604
21.4.1 Parallel.For()方法的取消 604
21.4.2 任务的取消 605
21.5 数据流 607
21.5.1 使用动作块 607
21.5.2 源和目标数据块 608
21.5.3 连接块 609
21.6 小结 611
第22章 任务同步 612
22.1 概述 613
22.2 线程问题 613
22.2.1 争用条件 614
22.2.2 死锁 616
22.3 lock语句和线程安全 618
22.4 Interlocked类 623
22.5 Monitor类 624
22.6 SpinLock结构 625
22.7 WaitHandle基类 626
22.8 Mutex类 627
22.9 Semaphore类 628
22.10 Events类 630
22.11 Barrier类 633
22.12 ReaderWriterLockSlim类 636
22.13 Timer类 639
22.14 小结 641
第23章 文件和流 643
23.1 概述 644
23.2 管理文件系统 644
23.2.1 检查驱动器信息 645
23.2.2 使用Path类 646
23.2.3 创建文件和文件夹 647
23.2.4 访问和修改文件的属性 648
23.2.5 创建简单的编辑器 649
23.2.6 使用File执行读写操作 651
23.3 枚举文件 653
23.4 使用流处理文件 654
23.4.1 使用文件流 655
23.4.2 读取流 659
23.4.3 写入流 659
23.4.4 复制流 660
23.4.5 随机访问流 661
23.4.6 使用缓存的流 663
23.5 使用读取器和写入器 663
23.5.1 StreamReader类 663
23.5.2 StreamWriter类 664
23.5.3 读写二进制文件 665
23.6 压缩文件 666
23.6.1 使用压缩流 667
23.6.2 压缩文件 668
23.7 观察文件的更改 668
23.8 使用内存映射的文件 670
23.8.1 使用访问器创建内存映射文件 671
23.8.2 使用流创建内存映射文件 673
23.9 使用管道通信 675
23.9.1 创建命名管道服务器 675
23.9.2 创建命名管道客户端 677
23.9.3 创建匿名管道 677
23.10 通过Windows运行库使用文件和流 679
23.10.1 Windows应用程序编辑器 679
23.10.2 把Windows Runtime类型映射为.NET类型 682
23.11 小结 684
第24章 安全性 685
24.1 概述 685
24.2 验证用户信息 686
24.2.1 使用Windows标识 686
24.2.2 Windows Principal 687
24.2.3 使用声称 688
24.3 加密数据 690
24.3.1 创建和验证签名 692
24.3.2 实现安全的数据交换 694
24.3.3 使用RSA签名和散列 697
24.3.4 实现数据的保护 700
24.4 资源的访问控制 703
24.5 使用证书发布代码 706
24.6 小结 707
第25章 网络 708
25.1 网络 708
25.2 HttpClient类 709
25.2.1 发出异步的Get请求 709
25.2.2 抛出异常 710
25.2.3 传递标题 711
25.2.4 访问内容 713
25.2.5 用HttpMessageHandler自定义请求 713
25.2.6 使用SendAsync创建HttpRequestMessage 714
25.2.7 使用HttpClient和Windows Runtime 715
25.3 使用WebListener类 717
25.4 使用实用工具类 720
25.4.1 URI 721
25.4.2 IPAddress 722
25.4.3 IPHostEntry 723
25.4.4 Dns 724
25.5 使用TCP 725
25.5.1 使用TCP创建HTTP客户程序 726
25.5.2 创建TCP侦听器 728
25.5.3 创建TCP客户端 736
25.5.4 TCP和UDP 740
25.6 使用UDP 740
25.6.1 建立UDP接收器 741
25.6.2 创建UDP发送器 742
25.6.3 使用多播 745
25.7 使用套接字 745
25.7.1 使用套接字创建侦听器 746
25.7.2 使用NetworkStream和套接字 749
25.7.3 通过套接字使用读取器和写入器 749
25.7.4 使用套接字实现接收器 751
25.8 小结 753
第26章 Composition 754
26.1 概述 754
26.2 Composition库的体系结构 756
26.2.1 使用特性的Composition 757
26.2.2 基于约定的部件注册 763
26.3 定义协定 766
26.4 导出部件 770
26.4.1 创建部件 770
26.4.2 使用部件的部件 776
26.4.3 导出元数据 776
26.4.4 使用元数据进行惰性加载 778
26.5 导入部件 779
26.5.1 导入连接 782
26.5.2 部件的惰性加载 784
26.5.3 读取元数据 784
26.6 小结 786
第27章 XML和JSON 787
27.1 数据格式 787
27.1.1 XML 788
27.1.2.NET支持的XML标准 789
27.1.3 在框架中使用XML 790
27.1.4 JSON 790
27.2 读写流格式的XML 792
27.2.1 使用XmlReader类读取XML 793
27.2.2 使用XmlWriter类 797
27.3 在.NET中使用DOM 798
27.3.1 使用XmlDocument类读取 799
27.3.2 遍历层次结构 799
27.3.3 使用XmlDocument插入节点 800
27.4 使用XPathNavigator类 802
27.4.1 XPathDocument类 802
27.4.2 XPathNavigator类 803
27.4.3 XPathNodeIterator类 803
27.4.4 使用XPath导航XML 803
27.4.5 使用XPath评估 804
27.4.6 用XPath修改XML 805
27.5 在XML中序列化对象 806
27.5.1 序列化简单对象 807
27.5.2 序列化一个对象树 809
27.5.3 没有特性的序列化 811
27.6 LINQ to XML 814
27.6.1 XDocument对象 815
27.6.2 XElement对象 816
27.6.3 XNamespace对象 817
27.6.4 XComment对象 818
27.6.5 XAttribute对象 819
27.6.6 使用LINQ查询XML文档 820
27.6.7 查询动态的XML文档 821
27.6.8 转换为对象 822
27.6.9 转换为XML 823
27.7 JSON 824
27.7.1 创建JSON 825
27.7.2 转换对象 825
27.7.3 序列化对象 827
27.8 小结 828
第28章 本地化 829
28.1 全球市场 830
28.2 System.Globalization名称空间 830
28.2.1 Unicode问题 830
28.2.2 区域性和区域 831
28.2.3 使用区域性 835
28.2.4 排序 841
28.3 资源 843
28.3.1 资源读取器和写入器 843
28.3.2 使用资源文件生成器 844
28.3.3 通过ResourceManager使用资源文件 845
28.3.4 System.Resources名称空间 846
28.4 使用WPF本地化 846
28.5 使用ASP.NETCore本地化 848
28.5.1 注册本地化服务 848
28.5.2 注入本地化服务 849
28.5.3 区域性提供程序 850
28.5.4 在ASP.NET Core中使用资源 851
28.6 本地化通用Windows平台 852
28.6.1 给UWP使用资源 853
28.6.2 使用多语言应用程序工具集进行本地化 854
28.7 创建自定义区域性 856
28.8 小结 857
第Ⅲ部分 Windows应用程序 860
第29章 核心XAML 860
29.1 XAML的作用 860
29.2 XAML概述 861
29.2.1 使用WPF把元素映射到类上 862
29.2.2 通过通用Windows应用程序把元素映射到类上 863
29.2.3 使用自定义.NET类 864
29.2.4 把属性用作特性 865
29.2.5 把属性用作元素 866
29.2.6 使用集合和XAML 867
29.3 依赖属性 867
29.3.1 创建依赖属性 868
29.3.2 值变更回调和事件 869
29.3.3 强制值回调和WPF 870
29.4 路由事件 871
29.4.1 用于Windows应用程序的路由事件 871
29.4.2 WPF的冒泡和隧道 873
29.4.3 用WPF实现自定义路由事件 875
29.5 附加属性 876
29.6 标记扩展 879
29.6.1 创建自定义标记扩展 880
29.6.2 XAML定义的标记扩展 882
29.7 小结 882
第30章 样式化XAML应用程序 883
30.1 样式设置 883
30.2 形状 884
30.3 几何图形 887
30.3.1 使用段的几何图形 887
30.3.2 使用PML的几何图形 888
30.3.3 合并的几何图形(WPF) 889
30.4 变换 889
30.4.1 缩放 890
30.4.2 平移 890
30.4.3 旋转 891
30.4.4 倾斜 891
30.4.5 组合变换和复合变换 891
30.4.6 使用矩阵的变换 891
30.4.7 变换布局 892
30.5 画笔 893
30.5.1 SolidColorBrush 893
30.5.2 LinearGradientBrush 894
30.5.3 ImageBrush 894
30.5.4 WebViewBrush 894
30.5.5 只用于WPF的画笔 895
30.6 样式和资源 898
30.6.1 样式 898
30.6.2 资源 900
30.6.3 从代码中访问资源 901
30.6.4 动态资源(WPF) 902
30.6.5 资源字典 903
30.6.6 主题资源(UWp) 905
30.7 模板 906
30.7.1 控件模板 907
30.7.2 数据模板 912
30.7.3 样式化ListView 913
30.7.4 ListView项的数据模板 915
30.7.5 项容器的样式 915
30.7.6 项面板 916
30.7.7 列表视图的控件模板 917
30.8 动画 918
30.8.1 时间轴 919
30.8.2 缓动函数 921
30.8.3 关键帧动画 927
30.8.4 过渡(UWP应用程序) 928
30.9 可视化状态管理器 931
30.9.1 用控件模板预定义状态 932
30.9.2 定义自定义状态 933
30.9.3 设置自定义的状态 934
30.10 小结 934
第31章 模式和XAML应用程序 935
31.1 使用MVVM的原因 935
31.2 定义MVVM模式 936
31.3 共享代码 938
31.3.1 使用API协定和通用Windows平台 938
31.3.2 使用共享项目 939
31.3.3 使用移动库 941
31.4 示例解决方案 942
31.5 模型 942
31.5.1 实现变更通知 943
31.5.2 使用Repository模式 944
31.6 视图模型 946
31.6.1 命令 948
31.6.2 服务和依赖注入 949
31.7 视图 952
31.7.1 注入视图模型 953
31.7.2 用于WPF的数据绑定 953
31.7.3 用于UWP的已编译数据绑定 955
31.8 使用事件传递消息 957
31.9 IoC容器 959
31.10 使用框架 961
31.11 小结 961
第32章 Windows应用程序:用户界面 962
32.1 概述 962
32.2 导航 963
32.2.1 导航回最初的页面 963
32.2.2 重写Page类的导航 965
32.2.3 在页面之间导航 965
32.2.4 后退按钮 967
32.2.5 Hub 969
32.2.6 Pivot 971
32.2.7 应用程序shell 972
32.2.8 汉堡按钮 976
32.2.9 分隔视图 977
32.2.10 给SplitView窗格添加内容 979
32.3 布局 981
32.3.1 VariableSizedWrapGrid 981
32.3.2 RelativePanel 983
32.3.3 自适应触发器 984
32.3.4 XAML视图 988
32.3.5 延迟加载 988
32.4 命令 989
32.5 已编译的数据绑定 992
32.5.1 已编译绑定的生命周期 992
32.5.2 给已编译的数据模板使用资源 994
32.6 控件 995
32.6.1 TextBox控件 995
32.6.2 AutoSuggest 996
32.6.3 Inking 998
32.6.4 读写笔触的选择器 1001
32.7 小结 1002
第33章 高级Windows应用程序 1003
33.1 概述 1003
33.2 应用程序的生命周期 1004
33.3 应用程序的执行状态 1004
33.4 导航状态 1007
33.4.1 暂停应用程序 1008
33.4.2 激活暂停的应用程序 1009
33.4.3 测试暂停 1010
33.4.4 页面状态 1011
33.5 共享数据 1013
33.5.1 共享源 1014
33.5.2 共享目标 1017
33.6 应用程序服务 1023
33.6.1 创建模型 1024
33.6.2 为应用程序服务连接创建后台任务 1025
33.6.3 注册应用程序服务 1026
33.6.4 调用应用程序服务 1027
33.7 相机 1029
33.8 Geolocation和Mapcontrol 1031
33.8.1 使用MapControl 1031
33.8.2 使用Geolocator定位信息 1034
33.8.3 街景地图 1036
33.8.4 继续请求位置信息 1037
33.9 传感器 1037
33.9.1 光线 1038
33.9.2 罗盘 1040
33.9.3 加速计 1041
33.9.4 倾斜计 1042
33.9.5 陀螺仪 1042
33.9.6 方向 1043
33.9.7 Rolling Marble示例 1044
33.10 小结 1046
第34章 带WPF的Windows桌面应用程序 1047
34.1 概述 1048
34.2 控件 1048
34.2.1 简单控件 1048
34.2.2 内容控件 1049
34.2.3 带标题的内容控件 1050
34.2.4 项控件 1052
34.2.5 带标题的项控件 1052
34.2.6 修饰 1052
34.3 布局 1053
34.3.1 StackPanel 1054
34.3.2 WrapPanel 1054
34.3.3 Canvas 1055
34.3.4 DockPanel 1056
34.3.5 Grid 1056
34.4 触发器 1058
34.4.1 属性触发器 1058
34.4.2 多触发器 1059
34.4.3 数据触发器 1060
34.5 菜单和功能区控件 1062
34.5.1 菜单控件 1062
34.5.2 功能区控件 1063
34.6 Commanding 1065
34.6.1 定义命令 1066
34.6.2 定义命令源 1067
34.6.3 命令绑定 1067
34.7 数据绑定 1068
34.7.1 BooksDemo应用程序内容 1069
34.7.2 用XAML绑定 1070
34.7.3 简单对象的绑定 1073
34.7.4 更改通知 1075
34.7.5 对象数据提供程序 1077
34.7.6 列表绑定 1079
34.7.7 主从绑定 1082
34.7.8 多绑定 1082
34.7.9 优先绑定 1084
34.7.10 值的转换 1086
34.7.11 动态添加列表项 1087
34.7.12 动态添加选项卡中的项 1088
34.7.13 数据模板选择器 1089
34.7.14 绑定到XML上 1091
34.7.15 绑定的验证和错误处理 1093
34.8 TreeView 1101
34.9 DataGrid 1106
34.9.1 自定义列 1108
34.9.2 行的细节 1109
34.9.3 用DataGrid进行分组 1109
34.9.4 实时成型 1112
34.10 小结 1118
第35章 用WPF创建文档 1119
35.1 简介 1119
35.2 文本元素 1120
35.2.1 字体 1120
35.2.2 TextEffect 1121
35.2.3 内联 1123
35.2.4 块 1124
35.2.5 列表 1126
35.2.6 表 1126
35.2.7 块的锚定 1128
35.3 流文档 1130
35.4 固定文档 1134
35.5 XPS文档 1137
35.6 打印 1139
35.6.1 用PrintDialog打印 1139
35.6.2 打印可见元素 1140
35.7 小结 1142
第36章 部署Windows应用程序 1143
36.1 部署是应用程序生命周期的一部分 1143
36.2 部署的规划 1144
36.2.1 部署选项 1144
36.2.2 部署要求 1144
36.2.3 部署.NET运行库 1145
36.3 传统的部署选项 1145
36.3.1 xcopy部署 1146
36.3.2 Windows Installer 1146
36.4 ClickOnce 1147
36.4.1 ClickOnce操作 1147
36.4.2 发布ClickOnce应用程序 1147
36.4.3 ClickOnce设置 1149
36.4.4 ClickOnce文件的应用程序缓存 1151
36.4.5 应用程序的安装 1151
36.4.6 ClickOnce部署API 1152
36.5 UWP应用程序 1153
36.5.1 创建应用程序包 1153
36.5.2 Windows App Certification Kit 1155
36.5.3 旁加载 1156
36.6 小结 1156
第Ⅳ部分 Web应用程序和服务 1158
第37章 ADO.NET 1158
37.1 ADO.NET概述 1158
37.1.1 示例数据库 1159
37.1.2 NuGet包和名称空间 1160
37.2 使用数据库连接 1160
37.2.1 管理连接字符串 1161
37.2.2 连接池 1162
37.2.3 连接信息 1162
37.3 命令 1162
37.3.1 ExecuteNonQuery()方法 1164
37.3.2 ExecuteScalar()方法 1165
37.3.3 ExecuteReader()方法 1165
37.3.4 调用存储过程 1167
37.4 异步数据访问 1168
37.5 事务 1169
37.6 小结 1173
第38章 Entity Framework Core 1174
38.1 EntityFramework简史 1174
38.2 Entity Framework简介 1176
38.2.1 创建模型 1176
38.2.2 创建上下文 1177
38.2.3 写入数据库 1178
38.2.4 读取数据库 1179
38.2.5 更新记录 1180
38.2.6 删除记录 1180
38.3 使用依赖注入 1181
38.4 创建模型 1184
38.4.1 创建关系 1184
38.4.2 用.NET CLI迁移 1185
38.4.3 用MSBuild迁移 1187
38.4.4 创建数据库 1188
38.4.5 数据注释 1189
38.4.6 流利API 1190
38.4.7 在数据库中搭建模型 1191
38.5 使用对象状态 1191
38.5.1 用关系添加对象 1192
38.5.2 对象的跟踪 1193
38.5.3 更新对象 1194
38.5.4 更新未跟踪的对象 1195
38.6 冲突的处理 1196
38.6.1 最后一个更改获胜 1196
38.6.2 第一个更改获胜 1198
38.7 使用事务 1202
38.7.1 使用隐式的事务 1202
38.7.2 创建显式的事务 1204
38.8 小结 1206
第39章 Windows服务 1207
39.1 Windows服务 1207
39.2 Windows服务的体系结构 1209
39.2.1 服务程序 1209
39.2.2 服务控制程序 1210
39.2.3 服务配置程序 1210
39.2.4 Windows服务的类 1211
39.3 创建Windows服务程序 1211
39.3.1 创建服务的核心功能 1211
39.3.2 QuoteClient示例 1214
39.3.3 Windows服务程序 1218
39.3.4 线程化和服务 1221
39.3.5 服务的安装 1222
39.3.6 安装程序 1222
39.4 Windows服务的监控和控制 1226
39.4.1 MMC管理单元 1226
39.4.2 net.exe实用程序 1227
39.4.3 sc.exe实用程序 1227
39.4.4 Visual Studio Server Explorer 1227
39.4.5 编写自定义ServiceController类 1228
39.5 故障排除和事件日志 1236
39.6 小结 1237
第40章 ASP.NET Core 1238
40.1 ASP.NET Core 1.0 1238
40.2 Web技术 1239
40.2.1 HTML 1239
40.2.2 CSS 1240
40.2.3 JavaScript和TypeScript 1240
40.2.4 脚本库 1240
40.3 ASP.NETWeb项目 1241
40.4 启动 1245
40.5 添加静态内容 1248
40.5.1 使用JavaScript包管理器:npm 1249
40.5.2 用gulp构建 1250
40.5.3 通过Bower使用客户端库 1252
40.6 请求和响应 1254
40.6.1 请求标题 1256
40.6.2 查询字符串 1258
40.6.3 编码 1259
40.6.4 表单数据 1260
40.6.5 cookie 1261
40.6.6 发送JSON 1262
40.7 依赖注入 1262
40.7.1 定义服务 1263
40.7.2 注册服务 1263
40.7.3 注入服务 1264
40.7.4 调用控制器 1264
40.8 使用映射的路由 1265
40.9 使用中间件 1266
40.10 会话状态 1268
40.11 配置ASP.NET 1270
40.11.1 读取配置 1271
40.11.2 基于环境的不同配置 1271
40.11.3 用户密钥 1272
40.12 小结 1273
第41章 ASP.NET MVC 1274
41.1 为ASP.NETMVC 6建立服务 1274
41.2 定义路由 1276
41.2.1 添加路由 1277
41.2.2 使用路由约束 1278
41.3 创建控制器 1278
41.3.1 理解动作方法 1278
41.3.2 使用参数 1279
41.3.3 返回数据 1280
41.3.4 使用Controller基类和POCO控制器 1281
41.4 创建视图 1283
41.4.1 向视图传递数据 1283
41.4.2 Razor语法 1284
41.4.3 创建强类型视图 1285
41.4.4 定义布局 1286
41.4.5 用部分视图定义内容 1290
41.4.6 使用视图组件 1294
41.4.7 在视图中使用依赖注入 1296
41.4.8 为多个视图导入名称空间 1296
41.5 从客户端提交数据 1296
41.5.1 模型绑定器 1298
41.5.2 注解和验证 1299
41.6 使用HTML Helper 1300
41.6.1 简单的Helper 1300
41.6.2 使用模型数据 1301
41.6.3 定义HTML特性 1302
41.6.4 创建列表 1302
41.6.5 强类型化的Helper 1303
41.6.6 编辑器扩展 1304
41.6.7 实现模板 1304
41.7 标记辅助程序 1305
41.7.1 激活标记辅助程序 1306
41.7.2 使用锚定标记辅助程序 1306
41.7.3 使用标签标记辅助程序 1307
41.7.4 使用输入标记辅助程序 1308
41.7.5 使用表单进行验证 1309
41.7.6 创建自定义标记辅助程序 1310
41.8 实现动作过滤器 1313
41.9 创建数据驱动的应用程序 1315
41.9.1 定义模型 1315
41.9.2 创建数据库 1317
41.9.3 创建服务 1319
41.9.4 创建控制器 1321
41.9.5 创建视图 1324
41.10 实现身份验证和授权 1327
41.10.1 存储和检索用户信息 1327
41.10.2 启动身份系统 1328
41.10.3 执行用户注册 1329
41.10.4 设置用户登录 1331
41.10.5 验证用户的身份 1332
41.11 小结 1333
第42章 ASP.NETWebAPI 1334
42.1 概述 1334
42.2 创建服务 1335
42.2.1 定义模型 1336
42.2.2 创建存储库 1336
42.2.3 创建控制器 1338
42.2.4 修改响应格式 1341
42.2.5 REST结果和状态码 1341
42.3 创建异步服务 1342
42.4 创建.NET客户端 1345
42.4.1 发送GET请求 1345
42.4.2 从服务中接收XML 1349
42.4.3 发送POST请求 1350
42.4.4 发送PUT请求 1351
42.4.5 发送DELETE请求 1352
42.5 写入数据库 1353
42.5.1 定义数据库 1353
42.5.2 创建存储库 1354
42.6 创建元数据 1356
42.7 创建和使用OData服务 1358
42.7.1 创建数据模型 1358
42.7.2 创建服务 1359
42.7.3 OData查询 1360
42.8 小结 1361
第43章 WebHooks和SignalR 1362
43.1 概述 1362
43.2 SignalR的体系结构 1363
43.3 使用SignalR的简单聊天程序 1364
43.3.1 创建集线器 1364
43.3.2 用HTML和JavaScript创建客户端 1365
43.3.3 创建SignalR.NET客户端 1367
43.4 分组连接 1370
43.4.1 用分组扩展集线器 1371
43.4.2 用分组扩展WPF客户端 1372
43.5 WebHooks的体系结构 1375
43.6 创建Dropbox和GitHub接收器 1376
43.6.1 创建Web应用程序 1376
43.6.2 为Dropbox和GitHub配置WebHooks 1377
43.6.3 实现处理程序 1377
43.6.4 用Dropbox和GitHub配置应用程序 1379
43.6.5 运行应用程序 1380
43.7 小结 1382
第44章 WCF 1383
44.1 WCF概述 1383
44.1.1 SOAP 1385
44.1.2 WSDL 1385
44.2 创建简单的服务和客户端 1386
44.2.1 定义服务和数据协定 1386
44.2.2 数据访问 1389
44.2.3 服务的实现 1390
44.2.4 WCF服务宿主和WCF测试客户端 1391
44.2.5 自定义服务宿主 1393
44.2.6 WCF客户端 1395
44.2.7 诊断 1397
44.2.8 与客户端共享协定程序集 1399
44.3 协定 1400
44.3.1 数据协定 1400
44.3.2 版本问题 1401
44.3.3 服务协定和操作协定 1401
44.3.4 消息协定 1402
44.3.5 错误协定 1403
44.4 服务的行为 1404
44.5 绑定 1408
44.5.1 标准绑定 1408
44.5.2 标准绑定的功能 1409
44.5.3 WebSocket 1410
44.6 宿主 1414
44.6.1 自定义宿主 1414
44.6.2 WAS宿主 1415
44.6.3 预配置的宿主类 1415
44.7 客户端 1416
44.7.1 使用元数据 1417
44.7.2 共享类型 1418
44.8 双工通信 1418
44.8.1 双工通信的协定 1418
44.8.2 用于双工通信的服务 1419
44.8.3 用于双工通信的客户应用程序 1420
44.9 路由 1421
44.9.1 路由示例应用程序 1422
44.9.2 路由接口 1423
44.9.3 WCF路由服务 1423
44.9.4 为故障切换使用路由器 1424
44.9.5 改变协定的桥梁 1425
44.9.6 过滤器的类型 1426
44.10 小结 1426
第45章 部署网站和服务 1427
45.1 部署Web应用程序 1427
45.2 部署前的准备 1428
45.2.1 创建ASP.NET 4.6Web应用程序 1428
45.2.2 创建ASP.NET Core 1.0Web应用程序 1429
45.2.3 ASP.NET 4.6的配置文件 1430
45.2.4 ASP.NETCore 1.0的配置文件 1431
45.3 部署到IIS 1433
45.3.1 使用IIS Manager准备Web应用程序 1433
45.3.2 Web部署到IIS 1437
45.4 部署到Microsoft Azure 1440
45.4.1 创建SQL数据库 1440
45.4.2 用SQL Azure测试本地网站 1440
45.4.3 部署到Microsoft Azure Web应用 1441
45.5 部署到Docker 1441
45.6 小结 1442