提升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之间共享代码
对于开发人员,把C#语言和.NET描述为重要的新技术一点都不夸张。.NET提供了一种环境。在这种环境中,可以开发在Windows上运行的几乎所有应用程序。在Windows上运行的是.NET Framework以前的版本,新版本.NET Core 1.0不仅在Windows上运行,还在Linux和Mac系统上运行。C#是专门用于.NET的编程语言。
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.1C# 1.0 ——一种新语言 3
1.2.2带有泛型的C# 2和.NET 2 5
1.2.3.NET 3.0—— Windows
Presentation Foundation 5
1.2.4C# 3和.NET 3.5—— LINQ 5
1.2.5C# 4和.NET 4.0—— dynamic
和TPL 6
1.2.6C# 5和异步编程 6
1.2.7C# 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.4NuGet 包 12
1.3.5公共语言运行库 13
1.3.6.NET Native 14
1.3.7Windows 运行库 14
1.4Hello, World 15
1.5 用.NET 4.6编译 16
1.6 用.NET CoreCLI编译 17
1.6.1设置环境 18
1.6.2构建应用程序 18
1.6.3打包和应用程序 21
1.7 应用程序类型和技术 22
1.7.1数据访问 22
1.7.2Windows桌面应用程序 23
1.7.3UWP 24
1.7.4SOAP服务和WCF 24
1.7.5Web服务和ASP.NET Web
API 24
1.7.6WebHooks和SignalR 25
1.7.7Windows服务 25
1.7.8Web应用程序 25
1.7.9Microsoft Azure 26
1.8 开发工具 27
1.8.1Visual Studio Community 27
1.8.2Visual Studio Professional with
MSDN 27
1.8.3Visual Studio Enterprise with
MSDN 27
1.8.4Visual Studio Code 28
1.9 小结 28
第2章 核心C# 29
2.1C#基础 30
2.2 用VisualStudio创建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.1using语句 58
2.7.2名称空间的别名 59
2.8Main()方法 60
2.9 使用注释 61
2.9.1源文件中的内部注释 61
2.9.2XML文档 62
2.10C#预处理器指令 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.11C#编程准则 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.1ref参数 92
3.6.2out参数 93
3.7 可空类型 94
3.8 枚举 95
3.9 部分类 97
3.10扩展方法 99
3.11Object类 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.6is和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.2IDisposable接口 131
5.4.3using语句 132
5.4.4实现IDisposable接口和
析构函数 133
5.4.5IDisposable和终结器的
规则 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.5Array类 185
7.5.1创建数组 185
7.5.2复制数组 186
7.5.3排序 187
7.6 数组作为参数 190
7.6.1数组协变 190
7.6.2ArraySegment 191
7.7 枚举 191
7.7.1IEnumerator接口 192
7.7.2foreach语句 192
7.7.3yield语句 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.4Action和Func
委托 248
9.2.5BubbleSorter示例 248
9.2.6多播委托 251
9.2.7匿名方法 254
9.3lambda表达式 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.1System.String类 265
10.1.1构建字符串 266
10.1.2StringBuilder成员 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.2RegularExpressionsPlayaround
示例 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.4Lookup类 312
11.8.5有序字典 313
11.9集 313
11.10性能 315
11.11小结 316
第12章 特殊的集合 317
12.1概述 317
12.2处理位 317
12.2.1BitArray类 318
12.2.2BitVector32结构 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.1LINQ概述 337
13.1.1列表和实体 338
13.1.2LINQ查询 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.7LINQ 查询中的变量 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.5LINQ提供程序 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.3System.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.1System.Type类 428
16.3.2TypeView示例 430
16.3.3Assembly类 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.5dynamic类型 443
16.6DLR 448
16.7包含DLR ScriptRuntime 449
16.8DynamicObject和
ExpandoObject 451
16.8.1DynamicObject 451
16.8.2ExpandoObject 453
16.9小结 455
第Ⅱ部分 .NET Core与Windows
Runtime
第17章 Visual Studio 2015 458
17.1使用Visual Studio 2015 458
17.1.1Visual Studio的版本 461
17.1.2Visual 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.2Solution 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.3Live 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.2Concurrency Visualizer 504
17.8.3代码分析器 505
17.8.4Code 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