首页>参考读物>计算机科学与技术>软件与程序设计

C# 8.0核心技术指南
作者 : [美] 约瑟夫·阿坝哈瑞(Joseph Albahari) 埃里克·约翰森(Eric Johannsen)著
译者 : 刘夏 译
出版日期 : 2021-06-01
ISBN : 978-7-111-68256-1
定价 : 279.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 1017
开本 : 16
原书名 : C# 8.0 in a Nutshell: The Definitive Reference
原出版社: O'Reilly Media, Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书全方位地介绍了 C# 的语言特性。在内容上,它兼顾了各种类型的读者。对于初学者,本书不论是介绍基本的语法,还是介绍高级的语言特性,都采用了讲解和示例结合的方法。而对于经验丰富的读者,本书的每一章都详尽而系统,是绝佳的案头参考书。
本书在前一版的基础上进行了大量的修订工作。不但将既有的内容和范例全部迁移到 .NET Core 之上,对 C# 8.0 与 .NET Core 3.x 提供的新特性进行了详细的介绍,还在部分示例中专门对编写跨平台运行的程序的技巧或陷阱进行了说明。可以说,本书从内容上涵盖了目前 C# 与 .NET Core 全新正式发行版的内容。

图书特色

图书前言

C# 8.0是Microsoft对其旗舰编程语言的第七次重大升级,这次升级极大地提高了C#语言的功能和灵活性。一方面,它提供了一些高级的抽象,例如查询表达式和异步延续;另一方面,它允许通过自定义值类型和可选的指针结构进行底层的效率优化。
C#语言特性的增长也极大地加重了我们的学习负担。虽然一些工具如Microsoft IntelliSense和在线参考文档可以提供诸多便利,但若要使用它们,仍需要一些现有的概念和知识体系作为支撑。本书以简明统一的方式(而非烦琐冗长的介绍)准确阐释了这些知识。
与之前的五个版本一样,本书也是围绕概念和用例来组织的,因此无论是顺序阅读还是随意浏览都会大有裨益。虽然本书只要求读者具备基本的背景知识,但是它仍然具有一定的深度,因此本书也适合中高级读者阅读。
本书内容涵盖C#语言、公共语言运行时(Common Language Runtime,CLR)和.NET Core核心程序集。我们之所以做出这样的选择是希望为一些难以理解的主题,例如并发、安全性以及访问操作系统功能留出足够的篇幅,而同时又不对内容的深度和可读性造成显著的影响。本书详细标记了C# 8的新特性,因此亦可同时作为C# 7的参考资料。
目标读者
本书主要针对中高级开发人员。本书不要求读者具备C#知识,但需要读者具备一定的通用编程经验。对于初学者,本书适合作为教材以外的补充书籍,而非替代编程教材。
本书非常适合与那些着眼于介绍具体应用技术的书籍配合阅读,例如介绍ASP.NET Core、Windows Presentation Foundation(WPF)和Universal Windows Platform(UWP)等技术的书籍。因为那些书籍往往会省略语言和.NET Core方面的内容,而这些内容正是本书的重点。
本书不适合想匆匆浏览每一种.NET技术的读者阅读,亦不适合关心特定领域(例如移动端设备开发)API使用方式的读者阅读。
本书的结构
本书第2~4章将详细介绍C#语言。首先介绍最基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是C#语言的初学者,请循序渐进地阅读这些章节。
其余各章则涵盖了.NET Core的核心功能,包括语言集成查询(Language-Integrated Query,LINQ)、XML、集合、并发、I/O和网络、内存管理、反射、动态编程、特性、安全以及原生互操作性等主题。第5~6章是后续章节主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ相关的三章最好按顺序阅读,其中的部分章节需要一些并发相关的知识,这些知识将在第14章中介绍。
使用本书所需的其他材料
运行本书中的示例需要.NET Core 3。此外,还可以使用Microsoft的.NET在线文档查找每一个具体类型及成员的信息。
虽然可以在记事本中书写源代码并从命令行中执行编译过程,但是为了提高效率,最好使用一个代码编辑执行工具随时测试各个代码片段并使用集成开发环境(Integrated Development Environment,IDE)来生成可执行文件或程序库。
对于Windows操作系统的用户,推荐从www.linqpad.net下载免费的LINQPad 6作为代码编辑执行工具。LINQPad完全支持C# 8.0,且该软件就是由本书的作者之一维护的。
至于Windows操作系统下的集成开发环境,建议下载并使用Microsoft Visual Studio 2019。该工具的任何版本都能够运行本书中的所有示例。如果需要使用跨平台的集成开发环境,则请下载Visual Studio Code。
LINQPad中包含了本书中的所有示例代码。这些示例代码均可以再次编辑并交互式运行。如需下载所有的示例代码,请在LINQPad底部左侧的“Samples”选项卡中单击“Download more samples”按钮,并选择“C# 8.0 in a Nutshell”。
.NET Core支持Windows、Linux和macOS。我们在Ubuntu Linux 18.04中对部分跨平台特性进行了测试。详细代码请参见GitHub(https://github.com/ericjohannsen/Nutshell8)。
排版约定
本书使用基本的UML符号来说明类型之间的关系,如图P-1所示。其中斜矩形代表抽象类,圆形代表接口。带有空心箭头的线段代表继承,其中箭头指向的类型是基类型。带有实心箭头的线段代表单向关联,不带箭头的线段代表双向关联。

图P-1:UML符号应用示例
本书还遵循以下排版约定:
斜体(Italic):
表示URI。
等宽字体(Constant width):
表示C#代码、关键字和标识符,以及应用程序的输出。
等宽粗体(Constant width bold):
代表代码中的重点部分。
等宽斜体(Constant width italic):
代表可由用户输入替换的文本。
该图标代表一般性注解。
示例代码
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的配套CD-ROM则需要O’Reilly出版社的许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处的形式包含书名、作者、出版社和ISBN,例如:
C# 8.0 in a Nutshell,作者Joseph Albahari和 Eric Johannsen ,由O’Reilly出版,书号978-1-492-05113-8
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。
O’Reilly在线学习平台(O’Reilly Online Learning)
近40年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和创新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量教材和视频资源。有关的更多信息,请访问http://oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O’Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
本书配套网站https://oreil.ly/c-sharp-8上列出了勘误表、示例以及其他信息。
如需获得示例代码以及其他相关资源,请访问http://www.albahari.com/nutshell。
若对本书有任何建议或技术问题,请发送电子邮件至bookquestions@oreilly.com。
如需获取更多有关O’Reilly的书籍、会议、资源中心及O’Reilly网络的信息,请访问http://www.oreilly.com。
致谢
Joseph Albahari
首先,感谢Eric Johannsen对本版的大力支持—他出色的工作让UNIX用户也能有相当好的阅读体验。同时也感谢我的兄弟Ben Albahari对本书前几版的杰出贡献。
很荣幸有这么优秀的技术审阅团队对本书进行审阅。尤其要感谢来自Microsoft的Vitek Karas和Stephen Toub。他们在百忙之中为本书提供了非常有价值的反馈。感谢Paulo Morgado、Aaron Robinson、Jan Vorlicek和Sam Gentile为本书做出的贡献。
本书是基于前几版编写的。请允许我一并对前几版的技术审阅者致以诚挚的谢意:感谢Rod Stephens、Jared Parsons、Stephen Toub、Matthew Groves、Dixin Yan、Lee Coward、Bonnie DeWitt、Wonseok Chae、Lori Lalonde和James Montemagno在前两版中的细致工作;感谢Eric Lippert、Jon Skeet、Stephen Toub、Nicholas Paldino、Chris Burrows、Shawn Farkas、Brian Grunkemeyer、Maoni Stephens、David DeWinter、Mike Barnett、Melitta Andersen、Mitch Wheat、Brian Peek、Krzysztof Cwalina、Matt Warren、Joel Pobar、Glyn Griffiths、Ion Vasilian、Brad Abrams和Adam Nathan对前几版的审阅。
上述审阅者中,有一大部分是来自Microsoft的资深专家。在他们的努力下,本书才能达到如今的高度。
感谢O’Reilly团队—尤其要感谢Corbin Collins高效而极具响应速度的编辑工作。最后深深地感谢我的妻子,Li Albahari。在整个项目期间,她的陪伴令我感到幸福而快乐。
Eric Johannsen
互联网让我足不出户就能和世界上那些最具天赋的人合作,真是令人惊叹。
首先,感谢Joseph Albahari邀请我参与这个卓越的项目。
在GitHub的.NET Core项目共同协作的Microsoft员工和社区成员都非常积极且乐于助人。当我无法找到某个棘手问题的解决方案时,都会得到他们非常迅速的回答。在此向他们的支持表示感谢。
感谢我的家人。正是他们的爱与支持令我能够坦然接受Joseph的邀请。感谢我的妻子Rose,是她在这段忙碌的时间里打理着大大小小的事务。最后感谢我的三个孩子—Sydney、Alexis和Ryan—对我的理解。

上架指导

计算机\程序设计

封底文字

这本畅销书籍将回答你在C# 8.0或.NET Core学习和开发中遇到的各种问题。C#语言拥有惊人的灵活性和生命力,它的持续发展也促使我们紧随其步伐不断学习。
本书围绕概念和用例进行组织,不但为中高级程序员提供了简明的C#和.NET知识体系,还进行了一系列深度探索。
? 从语法和变量到指针、闭包与模式等高级主题紧跟C#的进化速度。
? 专门使用三章对LINQ进行深度解析。
? 探索并发和异步编程、高级多线程编程以及并行编程知识。
? 全面介绍.NET功能,包括正则表达式、网络编程、序列化、
Span、反射以及加密功能。
? 详细介绍Roslyn——模块化的C#编译器服务。
“ 这本书是我案头上的必备参考书。”
——Scott Guthrie
Microsoft
“ 无论是初学者还是专家,都能从本书中学到C#的最新技术。”
——Eric Lippert
C# MVP
Joseph Albahari是C# 8.0 Pocket Reference和LINQ Pocket Reference的作者。他还是流行的代码编辑执行和LINQ查询工具LINQPad的创作者。
Eric Johannsen是软件开发和机器学习领域的领军人物,无论在商业方面还是在技术方面都很出色。他在为新兴业务构建软件解决方案方面具有非常丰富的经验。

译者序

C#是一门出色的语言,设计时兼顾了面向对象和函数式编程的特点。若你接触过C++或者Java,那么一定可以快速上手C#。
C#富有表现力且吸收了其他语言的经验。它的定义清晰,少有历史包袱。其进化速度之快也是有目共睹的。从2002年诞生到如今一共发布了14个版本(不包含技术预览版)。如果说这门语言在21世纪之初的十六年间都在慢跑的话,那么近几年的发展则是突飞猛进的。这种蓬勃发展主要体现在三个方面:
第一,从语言版本上讲,2017~2020年这四年间从6.0升级到了9.0 preview,包含六次正式的版本发布,每一次发布均包含明显的语言能力提升;
第二,C#和.NET有着紧密的关系。从平台上讲,微软对.NET平台的开放态度前所未有,.NET Core的发布真正让它的跨平台能力不再停留在理论层面,而其中的持续改进(不论是底层虚拟机层面的改进还是上层Framework的改进)让它在各个技术雷达上逐步被主流的技术团队锁定;
第三,国内外云平台对.NET Core的支持不断完善。
因此,不论在语言、平台还是云服务方面,C#和.NET Core都展现了强劲的发展势头。实际上除了.NET Core之外,用于移动设备开发的Xamarin和跨平台的游戏开发工具Unity也使用了C#作为主要的开发语言。我非常愿意将这样一门用途广泛、富有创造力的语言推荐给各位读者。而本书可谓是学习C#语言理想的一站式读物。
本书全方位地介绍了C#的语言特性。在内容上,它兼顾了不同层次的读者。对于初学者,本书不论是介绍基本的语法时,还是介绍高级的语言特性时,都采用了讲解和示例结合的方法。从原理到实践,双管齐下,因此阅读门槛并不高。尤其值得一提的是这些范例都可以直接在LINQPad工具中运行。充分练习这些范例有助于读者快速掌握C#语言的各种实践。而对于编程经验丰富的读者,本书的每一章都详尽而系统,非常适合案头参考。本书对.NET Core这一目前主流的跨平台.NET实现进行了详细的介绍。除了充分涵盖常用基础类库外,还对垃圾回收等运行时相关的主题进行了讨论。得益于作者开发LINQPad的丰富经验,本书最后一章对Roslyn编译服务的讲解系统而完整,是非常难得的参考资料。
本书在上一版《C# 7.0核心技术指南》的基础上进行了大量的修订。不但将既有的内容和范例全部迁移到了.NET Core上,对C# 8.0与.NET Core 3.x提供的新特性进行了详细的介绍,还在部分示例中专门对编写跨平台运行程序的技巧或陷阱进行了说明。可以说,本书在内容上涵盖了目前C#与.NET Core最新正式发行版的内容。
最后,感谢本书的作者Joseph Albahari。他在我翻译本书时给予了热情的帮助。我们就书中的一些技术细节进行了讨论,我将这些内容放在了译注中。感谢机械工业出版社华章分社的编辑们,他们给予了我很多专业的宝贵建议。他们高标准的把关保证了本书的质量。感谢我的家人,她们的支持给予了我不断前行的动力。希望这本书能给大家带来愉快的阅读体验。请进入C#的精彩世界吧!

刘夏
2020年于北京

图书目录

前言 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
作者介绍
封面介绍

教学资源推荐
作者: [美] 克里斯多夫 W. 弗雷泽(Christopher W. Fraser)戴维 R. 汉森(David R. Hanson) 著
作者: [美]H. H. 塔恩(H.H.Tan),T. B. 多拉齐奥(T.B.D'Orazio)[香港]柯兆恒(S. H. Or),玛丽安 M. Y. 周(Marian M. Y. Choy) 著
作者: Mario Hewardt Daniel Pravat
参考读物推荐
作者: 邵京京,白晶茹 等著
作者: [美]詹姆斯·W.库珀(James W. Cooper) 著
作者: 王炜 张思施 著
作者: (美)Colin Campbell; Ade Miller  著