新書推薦:
《
新能源材料
》
售價:NT$
290.0
《
传统文化有意思:古代发明了不起
》
售價:NT$
199.0
《
亚述:世界历史上第一个帝国的兴衰
》
售價:NT$
490.0
《
人工智能与大数据:采煤机智能制造
》
售價:NT$
440.0
《
新民说·逝去的盛景:宋朝商业文明的兴盛与落幕(上下册)
》
售價:NT$
790.0
《
我从何来:自我的心理学探问
》
售價:NT$
545.0
《
失败:1891—1900 清王朝的变革、战争与排外
》
售價:NT$
390.0
《
万千心理·我的精神分析之道:复杂的俄狄浦斯及其他议题
》
售價:NT$
475.0
編輯推薦:
这本专家级指南是有经验的程序员学习C#的超快方式。C#旨在帮助开发人员更快地完成更多工作,没有人比Microsoft MVP Christian Nagel更适合撰写这样一本对于现实开发有巨大帮助作用的权威指南。他从实用的角度出发,以清晰且易于理解的方式,向开发人员展示了如何为Windows和Linux平台构建.NET解决方案,如何使用Microsoft Azure服务来扩展开发,并以其他多种有意义的方式进行交互。
內容簡介:
? 为需要新的库和工具的高级开发人员介绍了C#和.NET的众多新特性
? 揭示了使用.NET库的最新技巧和实用提示,包括通道、异步流和新的JSON序列化器等
? 论述了使用ASP.NET Core、gRPC、SignalR、Azure Functions和Docker开发微服务的创新方式
? 为开发Web应用程序提供了逐步指导,包括ASP.NET Core Razor、ASP.NET Core Blazor Server和Blazor WebAssembly
? 讨论了如何使用新的WinUI 3库开发Windows桌面应用程序
關於作者:
Christian Nagel是Visual Studio和开发技术方向的Microsoft MVP,也是一名软件架构师和经验丰富的开发人员。他从2000年开始使用.NET技术构建解决方案。他撰写了许多备受称赞的.NET图书,并在国际会议,如Microsoft Ignite(原来的TechEd)和TechDays上发言。他是.NET用户组的支持者,微软认证培训师,也是WinUI和.NET MAUI应用程序、ASP.NET Core和Microsoft Azure的专业开发人员。
內容試閱 :
.NET早在2000年就被正式宣布,但直到现在,它依然活跃在开发人员的视野中。自从.NET变得开源,不只能够在Windows上使用,还能够在Linux平台上使用之后,就开始受到越来越多开发人员的青睐。通过使用WebAssembly标准,.NET还可以在客户端的浏览器中运行,且不需要安装插件。
随着C#和.NET新的增强功能的出现,现在关注点不只是提高性能,也在于提高易用程度。.NET成为越来越多新开发人员的选择。
对于有长时间开发经验的开发人员,C#也很有吸引力。每一年,Stack Overflow都会调查开发人员最喜欢、最不喜欢和最想要的编程语言和框架。多年来,C#一直在开发人员最喜欢的前10名编程语言榜单内。ASP.NET Core现在是开发人员最喜欢的框架。.NET Core在最喜欢的其他框架/库/工具分类中排名第一。详细信息可以参见网址0-5。
使用C#和ASP.NET Core时,可以创建在Windows、Linux和macOS上运行的Web应用程序和服务(包括微服务)。可以使用Windows Runtime,通过C#、XAML和.NET创建原生Windows应用程序。可以创建在ASP.NET Core、Windows应用程序和.NET MAUI之间共享的库,还可以创建传统的Windows Forms和WPF应用程序。
本书的大部分示例可以在Windows或Linux系统上运行。Windows应用程序示例是例外,它们只能运行在Windows平台上。可以使用Visual Studio、Visual Studio Code或Visual Studio for Mac作为开发环境,只有Windows应用程序示例需要使用Visual Studio。
0.1 .NET Core的世界
.NET有很长的历史,第一个版本发布于2002年。新一代.NET完全重写了原来的.NET,它还很年轻(.NET Core 1.0发布于2016年)。近来,旧的.NET版本的许多特性被添加到.NET Core中,使得迁移过程更加轻松。
创建新的应用程序时,没有理由不使用新的.NET版本。是应该继续使用老版本的.NET,还是迁移到新的.NET,这要取决于应用程序使用的特性,迁移的难度,以及迁移应用程序能够带来什么好处。对于不同的应用程序,最好的选择可能不一样。
新的.NET为创建Windows和Web应用程序及服务提供了简单的方式。可以创建在Kubernetes集群的Docker容器中运行的微服务;创建Web应用程序;使用新的OpenTelemetry标准,以独立于供应商的方式分析分布式跟踪;创建返回HTML、JavaScript和CSS的Web应用程序;以及创建返回HTML、JavaScript和.NET二进制文件的Web应用程序,这些.NET二进制文件通过使用WebAssembly,以安全的、标准的方式在客户端的浏览器中运行。可以使用WPF和Windows Forms,以传统的方式创建Windows应用程序,也可以使用现代XAML特性和控件,它们支持WinUI以及使用.NET MAUI的移动应用程序的流畅设计。
.NET使用现代模式。其核心服务(如ASP.NET Core和EF Core)中内置了依赖注入,这不只让单元测试变得更加简单,也使得开发人员更容易增强和修改这些技术的特性。
.NET能够在多个平台上运行。除了Windows和macOS,还支持许多Linux环境,如Alpine、CentOS、Debian、Fedora、openSUSE、Red Hat、SLES和Ubuntu。
.NET 开源(网址0-6)且免费可用。你可以找到C#编译器的会议记录(网址0-7)、C#编译器的源代码(网址0-8)、.NET运行库和库(网址0-9)以及支持Razor页面、Blazor和SignalR的ASP.NET Core(网址0-10)。
下面总结了新的.NET的一些特性:
● .NET是开源的。
● .NET使用现代模式。
● .NET支持在多个平台上开发。
● ASP.NET Core可以在Windows和Linux上运行。
0.2 C#的世界
C#在2002年发布时,是一种用于.NET Framework的开发语言。C#的设计思想来自C 、Java和Pascal。Anders Hejlsberg从Borland来到微软公司,带来了开发Delphi语言的经验。Hejlsberg在微软公司开发了Java的Microsoft版本J ,之后创建了C#。
注意:
Anders Hejlsberg现在已经转移到TypeScript(而他仍在影响C#), Mads Torgersen是C#的项目负责人。C#的改进可以在网址0-7上公开讨论。在这里,可以阅读C#语言建议和会议记录,也可以提交自己的C#建议。
C#一开始不仅作为一种面向对象的通用编程语言,也是一种基于组件的编程语言,支持属性、事件、特性(注解)和构建程序集(包括元数据的二进制文件)。
随着时间的推移,C#增强了泛型、语言集成查询(Language Integrated Query,LINQ)、lambda表达式、动态特性和更简单的异步编程。C#编程语言并不简单,它提供了很多功能,而且实际使用的功能在不断进化。因此,C#不仅是面向对象或基于组件的语言,它还包括函数式编程的理念,开发各种应用程序的通用语言会实际应用这些理念。
如今,每年都会发布一个新的C#版本。C# 8添加了可空引用类型,C# 9添加了记录等。C# 10在2021年随着.NET 6发布,C# 11将在2022年随着.NET 7发布。由于如今变化飞快,请查看本书的GitHub存储库来获得持续更新。
0.3 C#的新特性
每一年,新的 C#版本都会发布,提供许多新的特性。最新版本包含许多特性,例如使用可空引用类型来减少NullableReferenceException类型的异常,让编译器提供更多帮助;例如提高生产效率的特性,如索引和范围;例如使得switch语句看起来经典的switch表达式;例如使用声明的特性;例如对模式匹配的增强。顶级语句可以减少小型应用程序和记录的源代码行数。记录是类,只不过编译器会为它的相等性比较、解构和with表达式创建样板代码。代码生成器允许在编译器运行时自动创建代码。本书将讨论所有这些新特性。
0.4 ASP.NET Core中的新特性
ASP.NET Core现在包含一种新的创建Web应用程序的技术:Blazor Server和Blazor WebAssembly。Blazor提供了一种全栈选项,可以使用C#为客户端和服务器编写代码。在Blazor Server中,你创建的包含HTML和C#代码的Razor组件在服务器端运行。在Blazor WebAssembly中,使用C#和HTML编写的Razor组件通过HTML 5标准WebAssembly在客户端运行。WebAssembly允许在所有现代Web浏览器中运行二进制代码。
对于创建服务,现在可以在ASP.NET Core中使用gRPC来实现服务之间的二进制通信。对于服务与服务之间的通信,结合使用ASP.NET Core与gRPC可以降低需要的带宽,并且在需要进行大量数据传输时,还可以降低CPU和内存使用率。
0.5 Windows的新特性
对于为Windows开发应用程序,有一种新技术将通用Windows平台(Universal Windows Platform,UWP)和桌面应用程序的特性结合了起来,即WinUI 3。WinUI是Windows 10应用程序的原生UI平台。借助WinUI,可以使用包含已编译绑定的现代XAML代码来创建桌面应用程序。Microsoft的流畅设计系统中也提供了新的控件。不同于之前UWP平台随着Windows Runtime而交付,现在这些控件是独立于Windows 10版本来开发的,这就允许在Windows 10的1809版本及更高版本中使用最新控件。WinUI的路线图显示,将来也可以在WPF应用程序中使用这些新控件。
0.6 编写和运行C#代码的环境
.NET Core运行在Windows、Linux和macOS操作系统上。使用Visual Studio Code(网址0-11),可以在任何操作系统上创建和构建程序。在Windows或Linux平台上,可以使用.NET开发工具构建和运行本书的大部分示例。只有WinUI应用程序需要使用Windows平台,此时Visual Studio是最佳选项。构建和运行WinUI应用程序需要的最低版本是16.10。
使用.NET CLI和Azure CLI时,命令行起着重要的作用。你可以使用新的Windows终端。在最新的Windows 10版本中,该终端作为Windows的一部分提供。对于较旧的版本,可以在Microsoft Store中下载它。
大部分.NET开发人员使用Windows平台进行开发。使用Windows Subsystem for Linux (WSL 2)时,可以在Linux环境中构建和运行.NET应用程序,并且可以在Windows环境中安装不同的Linux发行版,访问相同的文件。Visual Studio甚至允许调试在WSL 2上的Linux环境中运行的.NET应用程序。
本书中的一些示例展示了如何使用Microsoft Azure作为可选的托管环境来运行Web应用程序、使用Azure Functions,以及使用Entity Framework Core来访问SQL Server和Azuer Cosmos DB。对于这些示例,可以使用Microsoft Azure的免费试用服务,请访问网址0-12进行注册。
0.7 本书内容
本书分为4个主要部分:
● C#语言
● 使用.NET的基类库
● 开发Web应用程序和服务
● 开发Windows应用程序
下面详细介绍不同部分的各章讲述的内容。
第I部分—— C#语言
本书第I部分介绍C#编程语言的方方面面。你将学到C#的语法选项,并了解C#语法如何与.NET中的类和接口整合在一起。本部分为学习C#语言打下坚实的基础。这里不假定你熟悉特定的编程语言,但认为你是一名有经验的程序员。该部分首先介绍C#的基本语法和数据类型,然后介绍C#的高级特性。
● 第1章介绍创建.NET应用程序的基础知识。你将了解.NET CLI,并使用C# 9的顶级语句创建一个Hello World应用程序。
● 第2章介绍C#的核心特性,并详细解释顶级语句以及关于变量声明和类型的信息。该章介绍目标类型的new表达式,解释可空引用类型,并定义包含新的switch表达式的程序流。
● 第3章介绍如何创建引用类型或值类型,创建和使用元组,以及使用C# 9的增强来创建和使用记录。
● 第4章详细介绍C#的面向对象技术,并演示C#中用于面向对象的所有关键字。还介绍了C# 9记录的继承。
● 第5章解释C#运算符,以及如何为自定义类型重载标准运算符。
● 第6章不只介绍简单的数组,还介绍多维数组和锯齿数组,使用Span类型来访问数组,以及使用新的索引和范围运算符来访问数组。
● 第7章介绍方法的.NET指针,lambda表达式和闭包,以及.NET事件。
● 第8章介绍不同类型的集合,例如列表、队列、栈、字典和不可变集合。该章还介绍了如何在不同的场景中选择合适的集合。
● 第9章介绍C#语言集成查询,用于查询集合中的数据。该章还介绍如何在查询中使用多个CPU核心,以及当在Entity Framework Core中使用LINQ来访问数据库时,表达式树中发生了什么。
● 第10章介绍如何处理错误,抛出和捕获异常,以及在捕获异常时过滤异常。
● 第11章介绍C#关键字async和await的应用,介绍基于任务的异步模式,还介绍异步流,这是C# 8中新增的特性。
● 第12章介绍如何在C#中使用和读取特性。介绍使用反射读取特性,还介绍源代码生成器,它允许在编译时创建源代码。
● 第13章是第I部分的最后一章,展示如何通过using语句和新的using声明来使用IDisposable接口,并将展示如何对托管和非托管内存使用Span类型。该章介绍如何在Windows和Linux环境中使用平台调用。
第II部分——库
第II部分首先创建自定义库和NuGet包,但这部分的主要主题是使用对于所有应用程序类型都很重要的.NET库。
● 第14章解释程序集和NuGet包之间的区别。你将学习如何创建NuGet包,还会学到一种新的C#特性“模块初始化器”,它允许在库中运行初始代码。
● 第15章详细介绍如何使用Host类来配置依赖注入容器,以及通过不同的配置提供程序(包括Azure App Configuration和用户秘密)在.NET应用程序中获取配置信息的内置选项。
● 第16章继续使用Host类来配置日志选项。你还将学到如何使用.NET提供程序读取提供的指标信息,如何使用Visual Studio App Center,以及如何使用OpenTelemetry为分布式跟踪扩展日志。
● 第17章介绍.NET为并行化和同步提供的多种特性。第11章介绍Task类的核心功能。该章则介绍Task类的更多功能,例如构成任务层次结构和使用ValueTask。该章介绍并行编程中会遇到的一些问题,如争用条件和死锁。对于同步,则介绍lock关键字可用的不同特性,以及Monitor、SpinLock、Mutex、Semaphore类等。
● 第18章介绍使用新的流API(它们允许使用Span类型)来读写文件系统,还介绍通过System.Text.Json名称空间中的类新提供的.NET JSON序列化器。
● 第19章介绍网络编程的基础类(如Socket类),以及如何使用TCP和UDP创建应用程序。还可以使用HttpClient工厂模式来创建在发生暂时性错误时自动重试的HttpClient对象。
● 第20章介绍用于加密数据的加密类,解释如何使用新的Microsoft.Identity平台进行用户身份验证,提供关于Web安全性的信息,以及关于编码和跨站请求伪造攻击的信息。
● 第21章介绍如何读写数据库的数据,包括EF Core提供的众多特性,如影子属性、全局查询过滤器、多对多关系以及EF Core现在提供的指标信息。还介绍如何使用EF Core读写Azure Cosmos DB。
● 第22章介绍如何使用对于Windows和Web应用程序都很重要的技术来本地化应用程序。
● 第23章介绍如何创建单元测试,使用.NET CLI分析代码覆盖率,以及在创建单元测试时使用模拟库。还介绍ASP.NET Core为创建集成测试提供的特性。
第III部分——Web应用程序和服务
本书第III部分介绍用于创建Web应用程序和服务的ASP.NET Core技术。可以在本地环境中运行这些应用程序和服务,也可以使用Azure App Services、Azure Static Web Apps或Azure Functions在云中运行它们。
● 第24章介绍 ASP.NET Core 的基础知识。该章基于第II部分介绍的依赖注入容器,展示ASP.NET Core如何使用中间件来向每个HTTP请求添加功能,以及为ASP.NET Core端点路由定义路由。
● 第25章介绍如何使用不同的技术(如ASP.NET Core和Azure Functions)来创建微服务,以及如何使用gRPC进行二进制通信。
● 第26章介绍如何使用ASP.NET Core技术与用户交互。该章介绍Razor页面、Razor视图以及Tag Helper和视图组件等功能。
● 第27章介绍Razor组件对ASP.NET Core的最新增强,这次增强允许实现在服务器和在客户端(使用WebAssembly)运行的C#代码。该章介绍Blazor Server和Blazor WebAssembly的区别,各自的局限,以及可用的内置组件。
● 第28章介绍如何使用ASP.NET Core的实时功能来向一组客户端发送信息,以及如何在SignalR中使用C#异步流。
第IV部分——应用程序
本书的第IV部分介绍XAML代码,以及使用Windows 10的原生UI平台WinUI来创建Windows应用程序。该部分介绍的许多信息也适用于WPF应用程序和.NET MAUI,适用于为移动平台开发基于XAML的应用程序。
● 第29章介绍XAML的基础知识,包括依赖属性和附加属性。你将学习如何创建自定义标记扩展,以及WinUI提供的控件类别,包括自适应触发器和延迟加载等高级技术。
● 第30章介绍使用MVVM模式所需的信息,以及如何在不同的基于XAML的技术(如WinUI、WPF和.NET MAUI)之间共享尽可能多的代码。
● 第31章介绍XAML形状和几何图形元素,展示样式和控件模板,说明如何创建动画,并解释如何在基于XAML的应用程序中使用可视化状态管理器。
0.8 如何下载本书的示例代码
读者在学习本书中的示例时,可手工输入所有的代码,也可使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点网址0-13上下载。登录到网址0-13,使用搜索框或书名列表就可找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有源代码,也可扫描封底的二维码获取本书的源代码和书中提到的网址。
注意:
许多图书的书名都很相似,所以通过ISBN查找本书是最简单的,本书英文版的ISBN是978-1-119-79720-3。
在下载代码后,只需要用自己喜欢的解压缩软件对它进行解压缩即可。
本书源代码也在 GitHub 上提供,网址是网址0-14。在GitHub中,还可以使用Web浏览器打开每个源代码文件。使用这个网站时,可以把完整的源代码下载到一个zip文件。还可以将源代码复制到系统上的本地目录,只需要安装git工具即可。为此可以使用Visual Studio或者从网址0-15下载Windows、Linux和macOS的git工具。要将源代码复制到本地目录,请使用git clone:
> git clone https://www.github.com/ProfessionalCSharp/ProfessionalCSharp2021
使用此命令,把完整的源代码复制到子目录ProfessionalCSharp2021。之后就可以开始处理源文件了。
在.NET更新后(本书的下个版本出版前),源代码将在GitHub上更新。请查看GitHub存储库中的readme.md文件以了解更新。如果在复制源代码之后源代码发生了变化,可以将当前目录更改为源代码目录,并提取最新的更改:
> git pull
如果对源代码做了更改,git pull可能会导致错误。如果发生这种情况,可以把更改隐藏起来,然后再次获取:
> git stash
> git pull
git命令的完整列表可以在网址0-16上找到。
如果有关于源代码的疑问,可以使用GitHub存储库的讨论功能。如果发现源代码有错误,可以在存储库中报告问题。在浏览器中打开网址0-14,单击Issues选项卡,单击New Issue按钮。这将打开一个编辑器。你应该尽可能详细地描述问题。
为了报告问题,需要一个GitHub账户。如果有GitHub账户,也可以将源代码存储库分叉到账户上。有关使用GitHub的更多信息,请查看网址0-17。
注意:
可以读取源代码和相关问题,并在不加入GitHub的情况下在本地复制存储库。要在GitHub上发布问题并创建自己的存储库,需要自己的GitHub账户。GitHub的基本功能是免费的(参见0-18)。
0.9 勘误表
尽管我们已经尽力保证不出现错误,但错误总是难免的,如果你在本书中找到了错误,如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。
要在网站上找到本书的勘误表,可以登录网址0-13,通过搜索框或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看图书编辑已提交的所有勘误项。
如果没有在Book Errata页面上发现自己找到的错误,请访问网址0-19,了解如何把自己发现的错误发送给我们。我们将检查信息,如果合适的话,将会把消息提交到该书的勘误页面,并在该书的后续版本中修复问题。