新書推薦:
《
河流之齿
》
售價:HK$
59.8
《
新经济史革命:计量学派与新制度学派
》
售價:HK$
89.7
《
盗墓笔记之秦岭神树4
》
售價:HK$
57.3
《
战胜人格障碍
》
售價:HK$
66.7
《
逃不开的科技创新战争
》
售價:HK$
103.3
《
漫画三国一百年
》
售價:HK$
55.2
《
希腊文明3000年(古希腊的科学精神,成就了现代科学之源)
》
售價:HK$
82.8
《
粤行丛录(岭南史料笔记丛刊)
》
售價:HK$
80.2
編輯推薦:
对于开发人员,把C#语言和.NET描述为*重要的新技术一点都不夸张。.NET提供了一种环境。在这种环境中,可以开发在Windows上运行的几乎所有应用程序。在Windows上运行的是.NET Framework以前的版本,新版本.NET Core 1.0不仅在Windows上运行,还在Linux和Mac系统上运行。C#是专门用于.NET的编程语言。
內容簡介:
提升C#和.NET技能的必备参考资源 Visual Studio 2015、ASP.NET Core 1.0和Universal Windows Platform的推出,为开发人员提供了使用C#创建应用程序的新方式。作为经典C#畅销书 ,本书涵盖了充分利用升级功能,积极简化工作流程所需的全部信息。本书循序渐进地讲解了Visual Studio 2015、.NET Core 1.0、ASP.NET MVC、Universal Windows Platform、WPF的*变化。每一章都提供了清晰的解释、下载的代码,并从专家的角度提供了有价值的视野。有本书在手,读者可以快速获得*的特性和功能。 主要内容 ◆ 通过.NET Core 和C# 6的增强功能,重新塑造了.NET平台,包括新增的.NET编译器平台 ◆ 展示了如何使用新的Visual Studio工具和用于ASP.NET Core 1.0、ASP.NET MVC、Web API、WPF和Universal Windows Platform的模板 ◆ 介绍允许应用程序在Windows、Linux和OS X上运行的.NET Core框架,还囊括了任务和并行编程,访问文件系统,以及网络堆栈 ◆ 演示了如何使用ASP.NET MVC 6和Web API创建Web应用程序,以及利用SignalR和WebHooks的推送通知 ◆ 介绍专业开发功能,例如单元测试,通过MVVM模式在WPF和Universal Windows Platform之间共享代码
關於作者:
Christian Nagel是微软开发技术代言人Microsoft Regional Director、Visual Studio和开发技术方向的微软MVP、软件架构师、资深开发人员2000年就开始用.NET技术建立解决方案 。他编著过多本.NET图书,经常在TechEd和TechDays等国际会议上发言,并支持.NET用户组。Christian是微软认证培训师MCT,也是Universal Windows apps和ASP.NET方向的微软认证开发专家MCPD。
目錄 :
第Ⅰ部分 C# 语 言
第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和.NET 4.0 dynamic
和TPL 6
1.2.6 C# 5和异步编程 6
1.2.7 C# 6和.NET Core 7
1.2.8 选择技术,继续前进 8
1.3 .NET 2015 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 用.NET 4.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.NET Web
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 Professional with
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 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和Func
委托 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
第17章 Visual Studio 2015 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
18.3.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和.NET Core 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.NET Core本地化 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应用程序
第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应用程序和服务
第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 Entity Framework简史 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.NET Web项目 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.NET MVC 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.NET Web API 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.6 Web
应用程序 1428
45.2.2 创建ASP.NET Core 1.0
Web应用程序 1429
45.2.3 ASP.NET 4.6的配置
文件 1430
45.2.4 ASP.NET Core 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
內容試閱 :
对于开发人员,把C#语言和.NET描述为最重要的新技术一点都不夸张。.NET提供了一种环境。在这种环境中,可以开发在Windows上运行的几乎所有应用程序。在Windows上运行的是.NET Framework以前的版本,新版本.NET Core 1.0不仅在Windows上运行,还在Linux和Mac系统上运行。C#是专门用于.NET的编程语言。例如,使用C#可以编写Web页面、Windows Presentation FoundationWPF应用程序、REST Web服务、分布式应用程序的组件、数据库访问组件、传统的Windows桌面应用程序,以及可以联机脱机运行的Universal Windows Platform UWP应用程序。本书介绍.NET Core 1.0和完整的.NET Framework,即.NET Framework 4.6。如果读者使用以前的版本编写代码,本书的一些章节就不适用。在可能的情况下,本书的示例都使用了.NET Core 1.0。本书的代码在Windows系统上创建,但也可以在其他平台上运行。可能需要对示例进行较小的改变,才能使它们在Linux上运行。阅读第1章可以了解如何构建用于Linux平台的应用程序,什么程序不能在Linux上运行?WPF应用程序仍然需要完整的.NET Framework,仅在Windows上运行。UWP应用程序使用.NET Core,但还需要Windows运行库。这些应用程序也需要Windows。这些UI技术都包含在本书的第Ⅲ部分中。那么,.NET和C#有什么优点?0.1 .NET Core的重要性为了理解.NET Core的重要性,就一定要考虑.NET Framework。.NET Framework 1.0在2002年发布,此后大约每两年就推出一个新的主要版本。Visual Studio 2013附带着C# 5和.NET 4.5。.NET Framework 4.5十分巨大,有20 000多个类。
这个巨大的框架有什么问题?.NET Core是如何解决的?对于新的开发人员来说,掌握这个巨大的框架并不容易。其中保留了旧应用程序很重要的许多内容,但它们对新的应用程序并不重要。对于有经验的开发人员来说,在这些技术中选择一个最好的是不容易的。必须为Web应用程序选择使用ASP.NET Web Forms还是ASP.NET MVC,为客户端应用程序选择使用Windows Forms和WPF还是Universal Windows Platform,为数据访问选择Entity Framework还是LINQ to SQL,为存储集合选择使用Array List还是List。这对于一些有经验的开发人员而言,选择是显而易见的,但对于大多数开发人员来说,选择并不是那么容易。刚开始接触.NET的开发人员就更困难了。.NET Core基于较小的单元 小型NuGet包。Console类只用于控制台应用程序。在.NET Framework中,Console类可用于mscorlib,mscorlib是每个.NET应用程序都引用的程序集。使用.NET Core,必须显式地决定使用NuGet包System.Console;否则,Console类就不可用。较小的包更容易摆脱框架的某些部分。如果需要给遗留应用程序使用旧的集合类,它们就可以通过NuGet包System.Collections.NonGeneric来使用。对于新的应用程序,可以定义能使用的软件包列表,System.Collections.NonGeneric可以排除在这个列表之外。如今,开发要快得多。在许多产品中,客户会收到产品的持续更新,而不是每两年接收一次新版本。甚至Windows 10都具备这么快的步伐。客户在每次更新时都收到较小的新特性,但收到新特性的速度更快。.NET Framework目前的发布周期是两年,还不够快。一些技术,如Entity Framework,已经绕过了这个问题,它可以通过NuGet包提供新功能,而NuGet包可以独立于.NET Framework来发布。更新较小的包,就允许更快的创新。.NET Core基于许多小型NuGet包,所以更容易改变。.NET Core和ASP.NET现在是开源的。.NET Core的源代码在http:www.github.comdotnet上,ASP.NET的源代码在http:www.github.comaspnet上。发布.NET时,Windows在客户端和服务器上都有很大的市场份额。现在,世界更加碎片化。许多公司决定不通过ASP.NET运行服务器端代码,因为它不在Linux上运行。而ASP.NET Core 1.0和.NET Core可以在Linux上运行。.NET Core独立于平台,支持Windows、Linux和Mac系统。对于客户端应用程序,可以在iPhone和Android上使用.NET和Xamarin。.NET Framework要求把开发过程中使用的.NET运行库版本安装到目标系统上。基于客户需求,许多应用程序的开发都受到要使用的.NET Framework版本的限制。这不仅是基于客户端的应用程序开发的问题,也是基于服务器的应用程序开发的问题。我们不得不转回旧的.NET运行库版本,因为供应商不支持最新的版本。而有了.NET Core,运行库会和应用程序一起交付给客户。建立ASP.NET时,与Active Server PagesASP,使用运行在服务器上的JavaScript或VBScript代码建立的兼容是一个重要的方面。现在不再需要了。建立ASP.NET Web Forms 时,开发人员不需要知道任何关于JavaScript和HTML的内容,一切都可以用服务器端代码完成。现在,因为有了大量的JavaScript框架和HTML的增强,所以需要对JavaScript和HTML进行更多的控制。在新版本的ASP.NET中,性能在框架体系结构中有很大的作用。只有真正需要的东西才施加性能影响。如果Web应用程序没有静态文件,就必须显式地决定是否使用它,否则就不会对它有性能影响。通过细粒度的控制,可以决定需要什么特性。为了得到更大的性能提升,.NET Core可以构建为本地代码。这不仅在Windows上是可能的,在Linux和Mac系统上也是可行的。这样,在程序启动时可以得到特别的性能改进,而且使用更少的内存。现在,遗留的应用程序有一个问题。大多数应用程序都不能轻松地切换到.NET Core上。完整的.NET Framework仅运行在Windows上也在进化。它进化的步伐没有.NET Core那么大,因为它是一个成熟的框架。在撰写本书时,发布了.NET 4.6.1,与之前的版本相比,其更新比较小。使用Windows Forms或ASP.NET Web Forms编写的应用程序仍然需要使用完整的框架,但它们可以利用.NET 4.6.1的增强功能。通过.NET 4.6.1,还可以使用为.NET Core建立的NuGet包。许多新的NuGet包采用便携的方式建立。通过ASP.NET MVC 5 Web应用程序,还可以决定改为运行在ASP.NET Core 1.0上的ASP.NET MVC 6。ASP.NET Core 1.0允许使用.NET Core或.NET 4.6。这可以简化转换过程。然而,要在Linux上运行ASP.NET MVC,则需要迁移ASP.NET MVC应用程序来使用.NET Core,但之前也不能在Linux上运行。下面总结.NET Core的一些特性:● .NET Core是开源的。● NuGet包较小,允许更快的创新。● .NET Core支持多个平台。● .NET Core可以编译为本地代码。● ASP.NET可以在Windows和Linux上运行。从.NET Core的特性可以看出,自.NET第1版以来,这个技术在.NET历史上给.NET带来的变化最大。这是一个新的开始,我们可以用更快的步伐继续新的开发旅程。0.2 C#的重要性C#在2002年发布时,是一个用于.NET Framework的开发语言。C#的设计思想来自于C、Java和Pascal。Anders Hejlsberg从Borland来到微软公司,带来了开发Delphi语言的经验。Hejlsberg在微软公司开发了Java的Microsoft版本J,之后创建了C#。C#一开始不仅作为一种面向对象的通用编程语言,而且是一种基于组件的编程语言,支持属性、事件、特性注解和构建程序集包括元数据的二进制文件。随着时间的推移,C#增强了泛型、语言集成查询Language Integrated Query,LINQ、lambda表达式、动态特性和更简单的异步编程。C#编程语言并不简单,因为它提供了很多特性,但它的实际使用的功能不断进化着。因此,C#不仅仅是面向对象或基于组件的语言,它还包括函数式编程的理念,开发各种应用程序的通用语言会实际应用这些理念。0.3 C# 6的新特性在C# 6中有一个新的C#编译器。它完成源代码的清理。现在自定义程序也可以使用编译器管道的特性,并使用Visual Studio的许多特性。这个新的C#编译器平台允许用许多新特性改进C#。虽然这些特性都没有LINQ或async关键字的影响大,但许多改进都提高了开发人员的效率。C# 6有哪些变化?0.3.1 静态的using声明静态的using声明允许调用静态方法时不使用类名。C# 5using System; etc.Console.WriteLine"Hello, World!";C# 6using static System.Console; etc.WriteLine"Hello, World";using static关键字参见第2章。0.3.2 表达式体方法表达式体方法只包括一个可以用lambda语法编写的语句:C# 5public bool IsSquareRectangle rect{return rect.Height == rect.Width;}C# 6public bool IsSquareRectangle rect = rect.Height == rect.Width;表达式体方法参见第3章。0.3.3 表达式体属性与表达式体方法类似,只有get存取器的单行属性可以用lambda语法编写:C# 5public string FullName{get{return FirstName " " LastName;}}C# 6public string FullName = FirstName " " LastName;表达式体属性参见第3章。0.3.4 自动实现的属性初始化器自动实现的属性可以用属性初始化器来初始化:C# 5public class Person{ public Person {Age = 24; } public int Age {get; set;}}C# 6public class Person{ public int Age {get; set;} = 42;}自动实现的属性初始化器参见第3章。0.3.5 只读的自动属性为了实现只读属性,C# 5需要使用完整的属性语法;而在C# 6中,可以使用自动实现的属性:C# 5private readonly int _bookId;
public BookId{ get {return _bookId; }}C# 6public BookId {get;}只读的自动属性参见第3章。0.3.6 nameof 运算符使用新的nameof运算符,可以访问字段名、属性名、方法名或类型名。这样,在重构时,就不会遗漏名称的改变:C# 5public void Methodobject o{ if o == null throw new ArgumentNullException"o";C# 6public void Methodobject o{ if o == null throw new ArgumentNullExceptionnameofo;nameof 运算符参见第8章。0.3.7 空值传播运算符空值传播运算符简化了空值的检查:C# 5int? age = p == null ? null : p.Age;C# 6int? age = p?.Age;新语法也有触发事件的优点:C# 5var handler = Event;if handler != null{ handlersource, e;}C# 6handler?.Invokesource, e;空值传播运算符参见第8章。0.3.8 字符串插值字符串插值删除了对string.Format的调用,它不在字符串中使用编号的格式占位符,占位符可以包含表达式:C# 5public override ToString{ return string.Format"{0}, {1}", Title, Publisher;}C# 6public override ToString = $"{Title} {Publisher}";与C# 5语法相比,C# 6示例的代码减少了许多,不仅因为它使用了字符串插值,还使用了表达式体方法。字符串插值还可以使用字符串格式,把它分配给FormattableString时会获得特殊的功能。字符串插值参见第10章。0.3.9 字典初始化器字典现在可以用字典初始化器来初始化,类似于集合初始化器。C# 5var dict = new Dictionary;dict.Add3, "three";dict.Add7, "seven";C# 6var dict = new Dictionary{ [3] = "three", [7] = "seven"};字典初始化器参见第11章。0.3.10 异常过滤器异常过滤器允许在捕获异常之前过滤它们。C# 5try{ etc.}catch MyException ex{ if ex.ErrorCode != 405 throw; etc.}C# 6try{ etc.}catch MyException ex when ex.ErrorCode == 405{ etc.}新语法的一大优势是,它不仅减少了代码的长度,而且没有改变堆栈跟踪在C# 5中会改变堆栈跟踪。异常过滤器参见第14章。0.3.11 Catch中的awaitawait现在可以在catch子句中使用。C# 5需要一种变通方法:C# 5bool hasError = false;string errorMessage = null;try{ etc.}catch MyException ex{ hasError = true; errorMessage = ex.Message;}if hasError{ await new MessageDialog.ShowAsyncerrorMessage;}C# 6try{ etc.}catch MyException ex{ await new MessageDialog.ShowAsyncex.Message;}这个功能不需要增强的C#语法,现在就能工作。这个增强需要微软公司大量的投资才能实现,但是否使用这个平台真的没有关系。对用户来说,这意味着需要更少的代码仅仅是比较两个版本。
0.4 UWP的新内容Windows 8引入一种新的编程API:Windows运行库Windows Runtime。使用Windows运行库的应用程序可以通过Microsoft Store来使用,且有许多不同的名称。最初称它为Metro应用程序或Metro样式的应用程序,也称为Modern应用程序、Windows Store应用程序尽管它们也可以通过PowerShell脚本来安装,不使用商店和Universal应用程序。这里可能遗漏了一些名字。如今,这些都只是Windows应用程序,运行在UWPUniversal Windows Platform,通用Windows平台上。这些应用程序的理念是,让最终用户很容易通过Microsoft商店找到它们,提供便于触屏的环境,这个环境是现代的用户界面,看起来很干净、光滑,并允许流畅地交互,而且应用程序是可以信任的。更重要的是,已经了解Windows用户界面的用户应该被新的环境所吸引。第1版的设计准则有诸多限制,有一些缺陷。如何在应用程序中寻找东西?许多用户在右边找不到工具栏,却发现它允许搜索许多应用程序。Windows 8.1把搜索功能搬到桌面的一个搜索框中。同时,如果用户不在屏幕上从上扫到下或从下扫到上,就经常找不到位于顶部或底部的应用栏。Windows 10使设计更加开放。可以使用对应用程序有用的东西,在用户界面上做出决定,因为它与用户和应用程序最匹配。当然,它仍然最适合创建出好看的、光滑的、流畅的设计。最好让用户与应用程序愉快地交互,确定如何完成任务应该不是很难。新的Windows运行库是Windows运行库3.0,它基于以前的版本,定义了XAML用户界面,实现了应用程序的生命周期,支持后台功能,在应用程序之间共享数据等。事实上,新版本的运行库在所有区域都提供了更多的功能。Windows应用程序现在使用.NET Core。通过NuGet包与Windows应用程序可以使用相同的.NET库。最后,本地代码编译后,应用程序启动更快,消耗的内存更少。与提供的附加功能相比,可能更重要的是现在可用的普遍性。Visual Studio 2013的第一次更新为Windows 8应用程序包括了一个新的项目类型:通用Universal应用程序。在这里,通用应用程序用3个项目实现:一个项目用于Windows应用程序,一个项目用于Windows Phone应用程序,另一个是共享的代码项目。甚至可以在这些平台之间共享XAML代码。新的通用项目模板包括一个项目。相同的二进制代码不仅可以用于Windows和Windows Phone,还可以用于Xbox、物联网Internet of Things,IoT设备和HoloLens等。当然,这些不同的平台所提供的功能不可能用于所有地方,但是使用这个不同的功能,仍然可以创建二进制图像,在每个Windows 10设备上运行。0.5 编写和运行C#代码的环境.NET Core运行在Windows、Linux和Mac操作系统上。使用Visual Studio Codehttps:code. visualstudio.com,可以在任何操作系统上创建和构建程序。最好用的开发工具是Visual Studio 2015,也是本书使用的工具。可以使用Visual Studio Community 2015版https:www. visualstudio.com,但本书介绍的一些功能只有Visual Studio的企业版提供。需要企业版时会提到。Visual Studio 2015需要Windows操作系统,要求使用Windows 8.1或更高版本。要构建和运行本书中的WPF应用程序,需要Windows平台。Windows 7仍支持运行WPF应用程序。要构建通用的Windows应用程序,可以使用Windows 8.1和Visual Studio,但要测试和运行这些应用程序,就需要Windows 10设备。0.6 本书的内容本书首先在第1章介绍.NET的整体体系结构,给出编写托管代码所需要的背景知识。此后概述不同的应用程序类型,学习如何用新的开发环境CLI编译程序。之后本书分几部分介绍C#语言及其在各个领域中的应用。第I部分 C#语言该部分给出C#语言的良好背景知识。尽管这一部分假定读者是有经验的编程人员,但它没有假设读者拥有任何特定语言的知识。首先介绍 C#的基本语法和数据类型,再介绍C#的面向对象特性,之后介绍C#中的一些高级编程主题,如委托、lambda表达式、语言集成查询LINQ、反射和异步编程。第II部分.NET Core与Windows Runtime该部分首先介绍全世界C#开发人员都使用的主要IDE:Visual Studio 2015。第17章学习Visual Studio企业版可用的工具。第18章还要学习C#编译器的工作原理,以及如何使用.NET编译器平台以编程方式修改代码。用C#代码创建功能时,不要跳过创建单元测试的步骤。一开始需要更多的时间,但随着时间的推移,添加功能和维护代码时,就会看到其优势。第19章介绍如何创建单元测试、网络测试和编码的UI测试。第20~28章介绍独立于应用程序类型的.NET Core和Windows运行库。第20章学习如何从应用程序中写出也可以在生产环境中使用的诊断信息。第21章和第22章介绍了使用任务并行库Task Parallel Library,TPL进行并行编程,以及用于同步的各种对象。第23章学习如何访问文件系统,读取文件和目录,了解如何使用System.IO名称空间中的流和Windows运行库中的流来编写Windows应用程序。第24章利用流来了解安全性,以及如何加密数据,允许进行安全的转换。还将学习使用套接字和使用更高级别的抽象如HttpClient,见第25章的联网的核心基础。第26章讨论了Microsoft Composition,它允许创建容器和部件之间的独立性。第27章论述如何将对象序列化到XML和JSON中,以及用于读取和编写XML的不同技术。最后,第28章学会使用本地化的技术本地化应用程序,该技术对Windows和Web应用程序都非常重要。第III部分Windows应用程序该部分的主题是使用XAML语法构建应用程序UWP通用Windows应用程序和WPF。第29章介绍XAML的基础,包括XAML语法、依赖属性,以及标记扩展可以创建自己的XAML语法。第30章学习如何给基于XAML的应用程序指定样式。第31章主要关注MVVMModel-View-View Model模式,学习利用基于XAML的应用程序中的数据绑定特性,允许在很多UWP应用程序和WPF应用程序之间共享代码。使用Xamarin也可以为iPhone和Android平台分享很多开发代码。然而,本书不探讨如何使用Xamarin进行开发。论述UWP应用程序和WPF应用程序的介绍性章节后,有两章的内容讨论UWP应用程序的具体特征,另外两章讨论WPF应用程序。第 32章和第33章介绍具体的XAML控件与UWP应用程序,如RelativePanel和AdaptiveTrigger、新编译的绑定、应用程序生命周期、共享数据和创建后台任务。第34章和第35章论述WPF专用特性,如Ribbon控件,显示分层数据的TreeView、WPF专用的数据绑定功能,创建流和固定文档,创建XPSXML Paper Specification文件。该部分的最后,第36章使用ClickOnce部署WPF应用程序,且包含在商店中获得UWP应用程序的信息。第IV部分Web应用程序和服务该部分阐述Web应用程序和服务,还包含关于ADO.NET的两章内容。虽然也可以在客户应用程序中使用ADO.NET第37章和Entity Framework第38章,但通常这些技术在服务器上使用,从客户端调用服务。第39章学习如何创建自己的Windows服务,操作系统启动时,Windows服务就会运行。ASP.NET的新版本ASP.NET Core 1.0参见第40章。其中讨论了ASP.NET的基础,以及如何使用这些基础知识建立ASP.NET MVC 6。ASP.NET MVC 6的特点参见第41章。
第42章讨论了ASP.NET MVC 6的REST服务特性:ASP.NET Web API。Web应用程序的发布和订阅技术使用ASP.NET技术WebHooks和SignalR的形式,在第43章中讨论。第44章讨论了使用SOAP和WCF与服务交流的旧技术。与前一部分一样,该部分的最后讨论部署,包括部署运行在互联网信息服务器Internet Information Server,IIS上的网站,或使用Microsoft Azure托管网站。0.7 如何下载本书的示例代码在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http:www.wrox.comgoprofessionalcsharp6上下载。登录到站点http:www.wrox.com上,使用Search工具或书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。也可以扫描封底的二维码获取本书的源代码。
在下载了代码后,只需要用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入http:www.wrox.comdynamicbooksdownload.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。.NET Core更新很快,所以本书的源代码也可以在http:www.github.comProfessionalCSharp上获得。注意,GitHub上的源代码提供了实时的源文件,它们会与Visual Studio的次要更新版本一起更新,还有新的实验性C#特性。为了在本书出版后,更新源代码和额外的示例,可以查看GitHub网站。对应本书印刷版本的稳定的源代码可以从Wrox网站上获得。0.8 勘误表尽管我们已经尽力来保证不出现错误,但错误总是难免的,如果你在本书中找到了错误,如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。要在网站上找到本书的勘误表,可以登录http:www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.commisc-pages booklist.shtml。如果在Book Errata页面上没有看到你找出的错误,请进入www.worx.comcontact techsupport.shtml,填写表单,发电子邮件,我们就会检查你的信息,如果是正确的,就在本书的勘误表中粘贴一条消息,我们将在本书的后续版本中采用。0.9 p2p.wrox.comP2P邮件列表是为作者和读者之间的讨论而建立的。读者可以在p2p.wrox.com上加入P2P论坛。该论坛是一个基于Web的系统,用于发送与Wrox图书相关的信息和相关技术,与其他读者和技术用户交流。该论坛提供了订阅功能,当论坛上有新帖子时,会给你发送你选择的主题。Wrox作者、编辑和其他业界专家和读者都会在这个论坛上讨论。在http:p2p.wrox.com上有许多不同的论坛,不只是可以帮助读者阅读本书,在读者开发自己的应用程序时,也可以从这个论坛中获益。要加入这个论坛,必须执行下面的步骤:1 进入p2p.wrox.com,单击Register链接。2 阅读其内容,单击Agree按钮。3 提供加入论坛所需要的信息及愿意提供的可选信息,单击Submit按钮。4 然后就可以收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。
加入论坛后,就可以发送新信息,回应其他用户的帖子。可以随时在Web上阅读信息。如果希望某个论坛给自己发送新信息,可以在论坛列表中单击该论坛对应的Subscribe to this Forum图标。对于如何使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作原理,以及许多针对P2P和Wrox图书的常见问题解答。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。
1 章第1 章 .NET 应用程序体系结构3提供这方面的帮助。其中包含用于创建Windows、Web 应用程序和服务的不同技术的信息,指导选择什么技术进行数据库访问,凸显了.NET 和.NET Core 之间的差异。1.2 回顾.NET 历史要更好地理解.NET 和C#的可用功能,最好先了解它的历史。表1-1 显示了.NET 的版本、对应的公共语言运行库Common Language Runtime,CLR的版本、C#的版本和Visual Studio 的版本,并指出相应版本的发布年份。除了知道使用什么技术之外,最好也知道不推荐使用什么技术,因为这些技术会被代替。表1-1.NET CLR C# Visual Studio1.0 1.0 1.0 20021.1 1.1 1.2 20032.0 2.0 2.0 20053.0 2.0 2.0 2005 扩展版3.5 2.0 3.0 20084.0 4.0 4.0 20104.5 4.0 5.0 20124.5.1 4.0 5.0 20134.6 4.0 6 2015.NET Core 1.0 CoreCLR 6 2015扩展版下面各小节详细介绍表1-1,以及C#和.NET 的发展。1.2.1 C# 1.0 一种新语言C# 1.0 是一种全新的编程语言,用于.NET Framework。开发它时,.NET Framework 由大约3000个类和CLR 组成。创建Java 的Sun 公司申请法庭判决不允许微软公司更改Java 代码后,Anders Hejlsberg 设计了C#。Hejlsberg 为微软公司工作之前,在Borland 公司设计了Delphi 编程语言一种Object Pascal 语言。Hejlsberg 在微软公司负责JJava 编程语言的微软版本。鉴于Hejlsberg 的背景,C#编程语言主要受到C、Java 和Pascal 的影响。因为C#的创建晚于Java 和C,所以微软公司分析了其他语言中典型的编程错误,完成了一些不同的工作来避免这些错误。这些不同的工作包括:● 在 if 语句中,布尔Boolean表达式是必须的C也允许在这里使用整数值。● 允许使用struct 和class 关键字创建值类型和引用类型Java 只允许创建自定义引用类型;在C中,struct 和class 之间的区别只是访问修饰符的默认值不同。● 允许使用虚拟方法和非虚拟方法 这类似于C,Java 总是创建虚拟方法。当然,阅读本书,你会看到更多的变化。第Ⅰ部分 C# 语言4现在,C#是一种纯粹的面向对象编程语言,具备继承、封装和多态性等特性。C#也提供了基于组件的编程改进,如委托和事件。在.NET 和CLR 推出之前,每种编程语言都有自己的运行库。在C中,C运行库与每个C程序链接起来。Visual Basic 6 有自己的运行库VBRun。Java 的运行库是Java 虚拟机Java VirtualMachine,JVC可以与CLR 相媲美。CLR 是每种.NET 编程语言都使用的运行库。推出CLR 时,微软公司提供了JScript .NET、Visual Basic .NET、 Managed C 和C#。JScript .NET 是微软公司的JavaScript 编译器,与CLR 和.NET 类一起使用。Visual Basic .NET 是提供.NET 支持的Visual Basic。现在再次简称为Visual Basic。Managed C是混合了本地C代码与Managed .NET 代码的语言。今天与.NET 一起使用的新C语言是C CLR。.NET 编程语言的编译器生成中间语言Intermediate Language,IL代码。IL 代码看起来像面向对象的机器码,使用工具ildasm.exe 可以打开包含.NET 代码的DLL 或EXE 文件来检查IL 代码。CLR 包含一个即时Just-In-Time,JIT编译器,当程序开始运行时,JIT 编译器会从IL 代码生成本地代码。CLR 的其他部分是垃圾回收器GC、调试器扩展和线程实用工具。垃圾回收器负责清理不再引用的托管内存,这个安全机制使用代码访问安全性来验证允许代码做什么;调试器扩展允许在不同的编程语言之间启动调试会话 例如,在Visual Basic 中启动调试会话,在C#库内继续调试;线程实用工具负责在底层平台上创建线程。.NET Framework 的第1 版已经很大了。类在名称空间内组织,以便于导航可用的3000 个类。名称空间用来组织类,允许在不同的名称空间中有相同的类名,以解决冲突。.NET Framework 的第1 版允许使用Windows Forms名称空间System.Windows.Forms创建Windows 桌面应用程序,使用ASP.NET Web Forms System.Web 创建Web 应用程序,使用ASP.NET Web Services 与应用程序和Web 服务通信,使用.NET Remoting 在.NET 应用程序之间更迅速地通信,使用Enterprise Services创建运行在应用程序服务器上的COM组件。ASP.NET Web Forms 是创建Web 应用程序的技术,其目标是开发人员不需要了解HTML 和JavaScript。服务器端控件会创建HTML 和JavaScript,这些控件的工作方式类似于Windows Forms本身。C# 1.2 和.NET 1.1 主要是错误修复版本,改进较小。注意:IL 代码也称为托管代码。注意:继承在第4 章中讨论,委托和事件在第9 章中讨论。注意:.NET 的每个新版本都有Professional C#图书的新版本。对于.NET 1.0,这本书已经是第2 版了,因为第1 版是以.NET 1.0 的Beta 2 为基础出版的。目前,本书是第10 版。第1 章 .NET 应用程序体系结构51.2.2 带有泛型的C# 2 和.NET 2C# 2 和.NET 2 是一个巨大的更新。在这个版本中,改变了C#编程语言,建立了IL 代码,所以需要新的CLR 来支持IL 代码的增加。一个大的变化是泛型。泛型允许创建类型,而不需要知道使用什么内部类型。所使用的内部类型在实例化即创建实例时定义。C#编程语言中的这个改进也导致了Framework 中多了许多新类型,例如System.Collections.Generic名称空间中新的泛型集合类。有了这个类,1.0 版本定义的旧集合类就很少用在新应用程序中了。当然,旧类现在仍然在工作,甚至在新的.NET Core 版本中也是如此。1.2.3 .NET 3.0 Windows Presentation Foundation发布.NET 3.0 时,不需要新版本的C#。3.0 版本只提供了新的库,但它发布了大量新的类型和名称空间。Windows Presentation FoundationWPF可能是新框架最大的一部分,用于创建Windows桌面应用程序。Windows Forms 包括本地Windows 控件,且基于像素;而WPF 基于DirectX,独立绘制每个控件。WPF 中的矢量图形允许无缝地调整任何窗体的大小。WPF 中的模板还允许完全自定义外观。例如,用于苏黎世机场的应用程序可以包含看起来像一架飞机的按钮。因此,应用程序的外观可以与之前开发的传统Windows 应用程序非常不同。System.Windows 名称空间下的所有内容都属于WPF,但System.Windows.Forms 除外。有了WPF,用户界面可以使用XML 语法设计XAMLXML for Applications Markup Language。.NET 3.0 推出之前,ASP.NET Web Services 和.NET Remoting 用于应用程序之间的通信。MessageQueuing 是用于通信的另一个选择。各种技术有不同的优点和缺点,它们都用不同的API 进行编程。典型的企业应用程序必须使用一个以上的通信API,因此必须学习其中的几项技术。WCFWindowsCommunication Foundation 解决了这个问题。WCF 把其他API 的所有选项结合到一个API 中。然而,为了支持WCF 提供的所有功能,需要配置WCF。.NET 3.0 版本的第三大部分是Windows WFWorkflow Foundation和名称空间System.Workflow。微软公司不是为几个不同的应用程序创建自定义的工作流引擎微软公司本身为不同的产品创建了几个工作流引擎,而是把工作流引擎用作.NET 的一部分。有了.NET 3.0,Framework 的类从.NET 2.0 的8 000 个增加到约12 000 个。1.2.4 C# 3 和.NET 3.5LINQ.NET 3.5 和新版本C# 3 一起发布。主要改进是使用C#定义的查询语法,它允许使用相同的语法来过滤和排序对象列表、XML 文件和数据库。语言增强不需要对IL 代码进行任何改变,因为这里使用的C#特性只是语法糖。所有的增强也可以用旧的语法实现,只是需要编写更多的代码。C#语言很容易进行这些查询。有了LINQ 和lambda 表达式,就可以使用相同的查询语法来访问对象集注意:本书一直在使用泛型,详见第6 章。第11 章介绍了泛型集合类。注意:在本书中,WPF 参见第29、30、31、34、35 和36 章。WCF 详见第44 章。第Ⅰ部分 C# 语言6合、数据库和XML 文件。为了访问数据库并创建LINQ 查询,LINQ to SQL 发布为.NET 3.5 的一部分。在.NET 3.5 的第一个更新中,发布了Entity Framework 的第一个版本。LINQ to SQL 和Entity Framework 都提供了从层次结构到数据库关系的映射和LINQ 提供程序。Entity Framework 更强大,但LINQ to SQL 更简单。随着时间的推移,LINQ to SQL 的特性在Entity Framework 中实现了,并且Entity Framework 会一直保留这些特性现在它看起来与第一个版本非常不同。另一种引入为.NET 3.5 一部分的技术是System.AddIn 名称空间,它提供了插件模型。这个模型提供了甚至在过程外部运行插件的强大功能,但它使用起来也很复杂。1.2.5 C# 4 和.NET 4.0 dynamic 和TPLC# 4 的主题是动态集成脚本语言,使其更容易使用COM 集成。C#语法扩展为使用dynamic 关键字、命名参数和可选参数,以及用泛型增强的协变和逆变。其他改进在.NET Framework 中进行。有了多核CPU,并行编程就变得越来越重要。任务并行库Task Parallel Library,TPL使用Task 类和Parallel 类抽象出线程,更容易创建并行运行的代码。因为用.NET 3.0 创建的工作流引擎没有履行自己的诺言,所以全新的Windows WorkflowFoundation 成为.NET 4.0 的一部分。为了避免与旧工作流引擎冲突,新的工作流引擎是在System.Activity 名称空间中定义的。C# 4 的增强还需要一个新版本的运行库。运行库从版本2 跳到版本4。发布Visual Studio 2010 时,附带了一项创建Web 应用程序的新技术:ASP.NET MVC 2.0。与ASP.NET Web Forms 不同,这项技术需要编写HTML 和JavaScript,并使用C#和.NET 的服务器端功能。ASP.NET MVC 是定期更新的。1.2.6 C# 5 和异步编程C# 5 只有两个新的关键字:async 和await。然而,它大大简化了异步方法的编程。在Windows 8中,触摸变得更加重要,不阻塞UI 线程也变得更加重要。用户使用鼠标,习惯于花些时间滚动屏幕。然而,在触摸界面上使用手势时,反应不及时很不好。Windows 8 还为Windows Store 应用程序也称为Modern 应用程序、Metro 应用程序、通用Windows 应用程序,最近称为Windows 应用程序引入了一个新的编程接口:Windows 运行库。这是一个本地运行库,看起来像是使用语言投射的.NET。许多WPF 控件都为新的运行库重写了,.NETFramework 的一个子集可以使用这样的应用程序。注意:LINQ 详见第13 章,Entity Framework 的最新版本与.NET 3.5 版本有很大差别,参见第38 章。注意:C# 4 的dynamic 关键字参见第16 章。任务并行库参见第21 章。ASP.NET 5和ASP.NET MVC 6 参见第40 和41 章。第1 章 .NET 应用程序体系结构7System.AddIn 框架过于复杂、缓慢,所以用.NET 4.5 创建了一个新的合成框架:ManagedExtensibility Framework 和名称空间System.Composition。独立于平台的通信的新版本是由ASP.NET Web API 提供的。WCF 提供有状态和无状态的服务,以及许多不同的网络协议,而ASP.NET Web API 则简单得多,它是基于Representational StateTransferREST软件架构风格的。1.2.7 C# 6 和.NET CoreC# 6 没有由泛型、LINQ 和异步带来的巨大改进,但有许多小而实用的语言增强,可以在几个地方减少代码的长度。很多改进都通过新的编译器引擎Roslyn 来实现。完整的.NET Framework 并不是近年来使用的唯一.NET Framework。有些场景需要较小的框架。2007 年,发布了Microsoft Silverlight 的第一个版本代码名为WPFE,即WPF Everywhere。Silverlight是一个Web 浏览器插件,支持动态内容。Silverlight 的第一个版本只支持通过JavaScript 编程。第2个版本包含.NET Framework 的子集。当然,不需要服务器端库,因为Silverlight 总是在客户端运行,但附带Silverlight 的框架Framework 也删除了核心特性中的类和方法,使其更简洁,便于移植到其他平台。用于桌面的Silverlight 最新版本第5 版在2011 年12 月发布。Silverlight 也用于WindowsPhone 的编程。Silverlight 8.1 进入Windows Phone 8.1,但这个版本的Silverlight 也不同于桌面版本。在Windows 桌面上,有如此巨大的.NET 框架,需要更快的开发节奏,也需要较大的改进。在DevOps 中,开发人员和操作员一起工作,甚至是同一个人不断地给用户提供应用程序和新特性,需要使新特性快速可用。由于框架巨大,且有许多依赖关系,创建新的特性或修复缺陷是一项不容易完成的任务。有了几个较小的.NET Framework如Silverlight、用于Windows Phone 的Silverlight,在.NET 的桌面版本和较小版本之间共享代码就很重要。在不同.NET 版本之间共享代码的一项技术是可移植库。随着时间的推移,有了许多不同的.NET Framework 和版本,可移植库的管理已成为一场噩梦。为了解决所有这些问题,需要.NET 的新版本是的,的确需要解决这些问题。Framework 的新版本命名为.NET Core。.NET Core 较小,带有模块化的NuGet 包以及分布给每个应用程序的运行库是开源的,不仅可用于Windows 的桌面版,也可用于许多不同的Windows 设备,以及Linux 和OS X。为了创建Web 应用程序,完全重写了ASP.NET Core 1.0。这个版本不完全向后兼容老版本,需要对现有的ASP.NET MVC和ASP.NET MVC 6代码进行一些修改。然而,与旧版本相比,它也有