多位微软MVP推荐,第一本ASP.NET 的书来了
《深入浅出ASP.NET Core》是一本基于.NET Core3.1平台,通过实战项目结合ASP.NET Core源代码解析和说明的教程书。
市场上讲解C#和.NET的书籍很多,在知乎上有赵三本之称《深入理解C#》、《CLR via C#》、《.NET设计规范 约定、惯用法与模式》的三本书更是入门和进阶必看的书籍。
以上三本书很经典,但是对于新人来说,要快速上手过于了晦涩。而关于.NET Core的书籍过于匮乏,尤其是中文书籍,大部分的书籍都是基于.NET Core 1.0到2.0的,中途的破坏式升级太多。
对于想循序渐进掌握ASP.NET Core 的新人来说,体验比较糟糕。
.NET 平台已经出现了20年了。它第一次正式对外公布是2000 年。距离现在已经20年了。中途它辉煌过,基于winform和webform 两个可拖控件的低代码开发形式迅速占领了很多市场。
而从2020年开始,低代码开发模式成为了2020年所提倡的了,但是当年一直被其他语言的开发者所诟病的,真的是时代在变化(微笑脸)。
.NET 也因为当初和Windows绑定的太深,导致不开源、不跨平台,导致在互联网如日中天的发展中,它错过了太多的机会。
直到了2020年大多数开发者对C#和.NET平台还停留在20年前的想象中,他们忘记了.NET 一直是微软的亲儿子。
从2014年.NET Core 开始进入我们的视野,2016年.NET Core 1.0发布正式版本,我们看到了希望,而微软也践行者,技术驱动的道路,提出微软爱Linux的口号,到收购Mono母公司,收购Github但让他保持独立运营,都是出于对技术的尊重与支持。
同时为了避免.NET 走上Java SDK收费的道路。
Oracle的做法从商业上无可厚非,公司是逐利的,但毕竟不是每个公司有拥有开发Open SDK的能力。
微软成立了.NET 基金会,将.NET 交付给.NET基金会,同时为了避免.NET基金会过于受到商业公司逐利的影响,过去的2年.NET 基金会中社区的开发人员开始增加,理事会中的微软数量开始降低,这些行为都在表面技术需要和商业区分开,而这些变化都是微软在用实际行动表明支持开源的决心。
等到2020年11月后,.NET Core 也将进入它的,替代.NET Framework 成为.NET 5。成为市场上唯一能涵盖人工智能、物联网、桌面开发、网页开发、云原生应用、移动应用和游戏开发等细分领域的开发框架。
深入浅出 ASP.NET Core ¥98 购买
.NET Core这么优秀的平台,我能将它写成书籍让更多的读者知晓它,是我的荣幸。
本书作者:梁桐铭 微软最有价值专家(Microsoft MVP)2018 Microsoft Tech Summit 讲师 52ABP框架的创始人。 现担任某上市公司内部培训师与架构师。 以“角落的白板报”的公众号发布一些视频和文章,活跃在B站和知乎上。
我个人在学习.NET的过程中,有幸看了不少.NET 有关的书籍,很多书籍都有一个特点,都是一开始都是很多散乱的知识点一次性讲解,比如讲解中间件的设计与原理的知识点,恨不得把中间件的知识点都写出来。
我想作者的心是好的,但是开发人员不领情,因为这就成为了文档,我何必去买本书呢。同时这样不利于初级开发人员,因为初级开发人员不知道这样的功能或者知识点能够解决什么业务问题。
所以我写本书的时候找了一条主线,那就是做一个项目,毕竟做项目是检验一个个知识点最重要的标准。同时我想书也应该具备面向对象的特点:封装、继承、多态。
书中的代码,你可以直接将它很多功能和内容,直接复制、粘贴到其他项目中复用,毕竟你如果学完本书,你会发现 你其实就已经造了一个开发框架,当然它是站在ASP.NET Core这个巨人身上的。
深入浅出 ASP.NET Core
ASP.NET Core包含的内容太广了,因此我选择了一条主线剧情,系统性的介绍ASP.NET Core,那就是搭建一个框架。
从零开始搭建一个实际的项目,从一个空文件夹开始,
• 搭建ASP.NET Core
• 安装MVC、TagHelper、路由等
• 使用Entity Framework Core组件
• 引入微软的身份认证权限框架 ASP.NET Core Identity
旨在帮助开发者入门,能够循序渐进地了解和掌握ASP.NET Core。
学完必知必会的内容后,继续了解ASP.NET Core WebAPI 已经如何发布到IIS、Linux以及Docker等环境中。
最后我们将这个项目改造成一个高可用的类似DDD的框架,所以本书中会有实际开发过程中的业务代码,存在,你可以自由的复制粘贴到其他项目中。
我想再多的语言也没有图片来的直接,下图是本书的所有知识点:
阅读源代码是每个开发者的必经之路,尤其是对技术有追求和抱负的开发者。因为阅读源代码,可以帮助我们更加的深入和理解这些模块设计者的初衷,毕竟源代码是最好的老师。 理解后我们在项目中尽可能的复用现有的框架特性,然后站在巨人的肩膀上去改进框架本身,实现自主创新。
当然本身毕竟不是源代码解析的书籍,所以选择了一条主线剧情中涉及到的源代码,带着大家一起去分析和学习,希望你可以通过这种方法,去阅读和学习更多的源代码。
谨以此书,献给一起为.NET Core 推广和奋斗的同仁们。也希望此书,能给读者带来实质性的收获。
梁桐铭 2020年9月3日
文章来源:异步图书
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
本章介绍如何使用 ASP.NET Core 在服务器端构建具有现代 HTTP 架构的网站。
ASP.NET Core 是一个由微软开发的免费、开源和跨平台的 web 框架,用于构建现代、基于云和互联网连接的应用程序。它是对之前的 ASP.NET 框架的重大重新设计,专注于灵活性、模块化和性能。
ASP.NET Core 提供了一个统一的编程模型,用于构建 Web 用户界面 (UI) 和 Web API,这意味着您可以使用相同的框架来处理服务器端和客户端逻辑。
ASP.NET Core 针对高性能进行了优化,能够处理大量的每秒请求。它具有轻量级的模块化架构,允许开发人员仅包含必要的组件,从而减少整体占用。
您将学习如何使用 ASP.NET Core 8 中引入的 Blazor 静态服务器端渲染 (SSR) 功能构建简单的网站。
本章涵盖以下主题:
- 探索 ASP.NET Core
- Blazor 的历史
- 探索 Blazor 静态 SSR
- 使用 Entity Framework Core 和 ASP.NET Core
在我们探索一个示例 ASP.NET Core 项目之前,让我们回顾一下它的架构。
ASP.NET Core 的架构由几个关键组件组成:
- 中间件:中间件组件用于处理请求和响应。它们在管道中串联在一起,每个中间件处理请求并将其传递给链中的下一个组件。在本章的可选在线部分中,您可以学习如何自定义此管道。
- 路由:路由组件负责将传入请求映射到适当的端点和 Blazor 组件。
- 依赖注入(DI)容器:这是内置的,用于管理服务对象的生命周期和依赖关系。
- 配置:ASP.NET Core 使用灵活的配置系统,支持多种来源,如 JSON 文件、环境变量和命令行参数。
- 日志记录:该框架具有一个日志记录 API,支持多种日志提供程序,允许您以一致的方式捕获和存储日志数据。
现在我们将创建一个空的 ASP.NET Core 项目,并探索如何使其能够提供简单的网页。
我们将创建一个 ASP.NET Core 项目,该项目将显示来自 Northwind 数据库的供应商列表。
dotnet 工具有许多项目模板,可以为您完成很多工作,但很难知道哪种模板最适合特定情况,因此我们将从空网站项目模板开始,然后逐步添加功能,以便您可以理解所有部分:
- 使用您首选的代码编辑器打开 ModernWeb 解决方案,然后添加一个新项目,如下列表所定义:
- 项目模板:ASP.NET Core 空项目 [C#] / web 。对于 Rider,选择名为 ASP.NET Core Web 应用程序的项目模板,然后将类型设置为空。
- 项目文件和文件夹: Northwind.Web 。
- 解决方案文件和文件夹: ModernWeb 。
- 对于 Visual Studio,保持所有其他选项为默认设置。
- 例如:
- 框架:.NET 9.0(标准术语支持)
- 配置为 HTTPS:已选择
- 启用 Docker:已清除
- 请勿使用顶级语句:已清除
- 对于 VS Code 和 dotnet new web 命令,默认选项是我们想要的。在未来的项目中,如果您想从顶级语句更改为旧的 Program 类样式,请指定开关 –use-program-main 。
在创建新项目时,Visual Studio 和 dotnet new 选项的摘要可以在以下链接的 GitHub 仓库中找到:https://github.com/markjprice/cs13net9/blob/main/docs/ch01-project-options.md。
- 构建 Northwind.Web 项目。
- 在 Northwind.Web.csproj 中,请注意该项目类似于类库,只是 SDK 是 Microsoft.NET.Sdk.Web ,如下标记中所示:
添加一个元素以全局和静态方式导入 System.Console 类,如下所示的标记:
- 如果您使用的是 Visual Studio,请在解决方案资源管理器中切换显示所有文件。如果您使用的是 Rider,请将光标移动到解决方案窗格上,然后点击“眼球”图标。
- 展开 obj 文件夹,展开 Debug 文件夹,展开 net9.0 文件夹,并选择 Northwind.Web.GlobalUsings.g.cs 文件。请注意,隐式导入的命名空间包括控制台应用程序或类库的所有命名空间,以及一些 ASP.NET Core 的命名空间,例如 Microsoft.AspNetCore.Builder ,如下代码所示:
- 关闭文件并折叠 obj 文件夹。
- 在 Northwind.Web 项目/文件夹中,展开名为 Properties 的文件夹,打开名为 launchSettings.json 的文件,并注意名为 http 和 https 的配置文件。它们有随机分配的端口号,您将在下一步中更改,因此现在只需记下它们的位置,如以下配置中所示的高亮部分:
launchSettings.json 文件仅在开发期间使用。它对构建过程没有影响。它不会与编译后的网站项目一起部署,因此对生产运行时没有影响。它仅被像 Visual Studio 和 Rider 这样的代码编辑器处理,以设置环境变量并定义项目在代码编辑器启动时供 Web 服务器监听的 URL。
- 对于 https 配置文件,对于其 applicationUrl ,将 http 的分配端口号更改为 5130 ,将 https 更改为 5131 ,并交换顺序,使 http 在列表中排在第一位,并将作为默认使用,如以下标记中所示:
http 和 https 启动配置文件具有 commandName 为 Project ,这意味着它们使用项目中配置的网络服务器来托管网站,默认情况下是 Kestrel。还有一个用于 IIS 的配置文件和设置,IIS 是仅限 Windows 的网络服务器。在本书中,我们将仅使用 Kestrel 作为网络服务器,因为它是跨平台的。为了简化您的 launchSettings.json 文件,您甚至可以删除 iisSettings 和 IIS Express 部分。
- 将更改保存到 launchSettings.json 并关闭文件。
- 在 Program.cs 中,请注意以下事项:一个 ASP.NET Core 项目就像一个顶级控制台应用程序,具有一个隐藏的 <Main>$ 方法作为其入口点,该方法使用名称 args 传递一个参数。它调用 WebApplication.CreateBuilder ,该函数使用默认的网络主机创建网站的主机,然后进行构建。该网站将对所有 HTTP GET 请求以该网站的根路径响应以下纯文本: Hello World! 。对 Run 方法的调用是一个阻塞调用,因此隐藏的 <Main>$ 方法在 web 服务器停止运行之前不会返回。
Program.cs 的内容在以下代码中显示:
在现有对 MapGet 的调用后,添加两个调用以定义一个返回匿名 C# 对象作为 JSON 的端点,以及一个返回网页的端点,如以下代码所示:
除了 Json 和 Content , Results 类还有许多其他方法,如 BadRequest 、 Bytes 、 Created 、 File 、 NoContent 、 NotFound 、 Ok 、 Problem 、 Redirect 等。您可以在以下链接了解更多信息:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.results。
- 在 Program.cs 的底部,添加一个注释以解释 Run 方法,并在 Run 之后写一条消息到控制台,因此,在网络服务器停止后,如以下代码中突出显示的内容所示:
我们现在将测试 ASP.NET Core 空网站项目的功能。我们还将通过将 HTTP 切换到 HTTPS 来启用浏览器与 Web 服务器之间所有流量的加密,以保护隐私。HTTPS 是 HTTP 的安全加密版本。
- 对于 Visual Studio:在工具栏中,确保选择了 https 配置文件(而不是 http、IIS Express 或 WSL),然后将 Web 浏览器更改为 Google Chrome,如图 13.1 所示:
图 13.1:在 Visual Studio 中选择带有 Kestrel Web 服务器的 https 配置文件
- 导航到 调试 | 无调试启动….
- 在 Windows 中,如果您看到 Windows 安全警报,提示 Windows Defender 防火墙已阻止此应用程序的一些功能,请点击允许访问按钮。
- 第一次启动安全网站时,您可能会收到通知,您的项目已配置为使用 SSL,为了避免浏览器中的警告,您可以选择信任 ASP.NET Core 生成的自签名证书。点击“是”。当您看到安全警告对话框时,再次点击“是”。
- 对于 VS Code,输入命令以 https 配置文件启动项目,如下所示: dotnet run –launch-profile https 。然后启动 Chrome。
- 对于骑手:导航到 运行 | 编辑配置….在运行/调试配置对话框中,选择 Northwind.Web: https。在对话框底部,位于“启动后”复选框的右侧,选择 Chrome,然后点击确定。导航到 运行 | 运行 ‘Northwind.Web: https’
- 在 Visual Studio 的命令提示符窗口或 VS Code 的终端中,请注意以下内容,如下输出所示:网络服务器已开始监听我们为 HTTP 和 HTTPS 分配的端口。您可以按 Ctrl + C 关闭 Kestrel Web 服务器。托管环境是 Development 。
Visual Studio 还会自动启动您选择的浏览器并导航到第一个 URL。如果您使用的是 VS Code,您需要手动启动 Chrome。
- 在命令提示符或终端中保持 Kestrel web 服务器运行。
- 在 Chrome 中,显示开发者工具,然后点击网络标签。
- 请求网站项目的主页:如果您使用的是 Visual Studio,并且 Chrome 自动启动并已为您输入了 URL,请单击“重新加载此页面”按钮或按 F5。如果您正在使用 VS Code 和命令提示符或终端,则在 Chrome 地址栏中手动输入地址 http://localhost:5130/ 。
- 在网络选项卡中,点击 localhost,并注意响应是来自跨平台 Kestrel web 服务器的纯文本 Hello World!,如图 13.2 所示:
图 13.2:网站项目的纯文本响
像 Chrome 这样的浏览器可能还会请求一个 favicon.ico 文件以在其浏览器窗口或标签中显示,但该文件在我们的项目中不存在,因此显示为 404 Not Found 错误。如果这让你感到烦恼,你可以在以下链接免费生成一个 favicon.ico 文件并将其放入项目文件夹中:https://favicon.io/。在网页中,你还可以在元标签中指定一个,例如,使用 Base64 编码的空白文件,如以下标记所示:
<link rel=\”icon\” href=\”data:;base64,iVBORw0KGgo=\”>
- 输入地址 https://localhost:5131/ ,请注意,如果您没有使用 Visual Studio 或在被提示信任 SSL 证书时点击了“否”,那么响应将是隐私错误。当您没有配置浏览器可以信任的证书以加密和解密 HTTPS 流量时,您将看到此错误(如果您没有看到此错误,那是因为您已经配置了证书)。在生产环境中,您可能希望向像 Verisign 这样的公司支付 SSL 证书费用,因为他们提供责任保护和技术支持。在开发过程中,您可以告诉您的操作系统信任 ASP.NET Core 提供的临时开发证书。
Visual Studio 还会自动启动您选择的浏览器并导航到第一个 URL。如果您使用的是 VS Code,您需要手动启动 Chrome。
- 输入地址 https://localhost:5131/data 并注意返回了一些 JSON。
- 输入地址 https://localhost:5131/welcome 并注意返回了一个网页。
- 在命令提示符或终端中,按 Ctrl + C 关闭网络服务器,并注意写入的消息,如以下输出中突出显示的内容:
- 如果您需要信任本地自签名的 SSL 证书,请在命令行或终端中输入以下命令: dotnet dev-certs https –trust 。
- 注意消息请求信任 HTTPS 开发证书。您可能会被提示输入密码,并且可能已经存在有效的 HTTPS 证书。
启用更严格的安全性并自动将 HTTP 请求重定向到 HTTPS 是一种良好的做法。
良好实践:一个可选但推荐的安全增强是 HTTP 严格传输安全(HSTS),您应该始终启用它。如果一个网站指定了它并且浏览器支持它,那么它会强制所有通信通过 HTTPS 进行,并防止访问者使用不受信任或无效的证书。
现在就来做吧:
- 在 Program.cs 中,在构建 app 的语句之后,添加一个区域和一个 if 语句,以在非开发环境中启用 HSTS,并将 HTTP 请求重定向到 HTTPS,如以下代码中突出显示的内容所示:
- 使用 https 启动配置启动 Northwind.Web 网站项目而不进行调试。
- 如果 Chrome 仍在运行,请关闭并重新启动它。
- 在 Chrome 中,显示开发者工具,然后点击网络标签。
- 输入地址 http://localhost:5130/ ,并注意服务器如何以 307 临时重定向响应到 https://localhost:5131/ ,以及证书是有效且受信任的,如图 13.3 所示:
图 13.3:连接现在使用有效证书和 307 重定向进行安全保护
- 关闭 Chrome 并关闭网络服务器。
良好实践:记得在完成网站测试后,通过切换到命令提示符或终端并按 Ctrl + C 来关闭 Kestrel 网络服务器。
在 ASP.NET Core 5 及更早版本中,项目模板设置了一条规则,表示在开发模式下,任何未处理的异常将在浏览器窗口中显示,以便开发人员查看异常的详细信息,如以下代码所示:
使用 ASP.NET Core 6 及更高版本,此代码由 WebApplication 构建器默认配置,因此会自动执行,因此在项目模板 Program.cs 源代码中不再需要。
ASP.NET Core 如何知道我们何时在开发模式下运行,以便 IsDevelopment 方法返回 true ,并且这段额外代码执行以设置开发者异常页面?让我们来看看。
ASP.NET Core 可以从设置文件和环境变量中读取,以确定使用哪个托管环境,例如 DOTNET_ENVIRONMENT 或 ASPNETCORE_ENVIRONMENT 。
您可以在本地开发期间覆盖这些设置:
- 在 Northwind.Web 文件夹中,展开名为 Properties 的文件夹,并打开名为 launchSettings.json 的文件。请注意, https 启动配置将托管环境的环境变量设置为 Development ,如下所示在以下配置中突出显示:
- 将 ASPNETCORE_ENVIRONMENT 环境变量从 Development 更改为 Production 。
- 如果您正在使用 Visual Studio,可以选择将 launchBrowser 更改为 false 以防止 Visual Studio 自动启动浏览器。当您使用 dotnet run 或 Rider 启动网站项目时,此设置将被忽略。
- 在 Program.cs 中,将第一个 MapGet 语句修改为返回环境的名称,而不是 Hello World ,如下代码中所示的高亮部分:
使用 https 启动配置启动网站项目,并注意托管环境为 Production ,如下所示的输出:
- 在 Chrome 中,请注意纯文本是 Environment is Production 。
- 关闭网络服务器。
- 在 launchSettings.json 中,将环境变量更改回 Development ,并将更改保存到文件中。
更多信息:您可以通过以下链接了解有关环境的更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments。
C# 13 和 .NET 9 全知道 : 1 你好,C#! .NET! (4)
下一个任务是编译和运行代码:
- 在解决方案资源管理器中,右键单击 HelloCS 项目中的任何文件,然后选择在集成终端中打开。
- 在终端中输入以下命令: dotnet run 。
- 终端窗口中的输出将显示运行您应用程序的结果。
- 在 Program.cs 中,在输出消息的语句之后,添加语句以获取 Program 类的命名空间名称,将其写入控制台,然后抛出一个新的异常,如下代码所示:
- 在终端中输入以下命令: dotnet run 。
在终端中,您可以按上箭头和下箭头循环浏览之前的命令,然后按左箭头和右箭头编辑命令,最后按回车键运行它们。
- 在终端窗口中的输出将显示运行您的应用程序的结果,包括编译器定义了一个隐藏的 Program 类,该类具有一个名为 <Main>$ 的方法,该方法有一个名为 args 的参数用于传递参数,并且它没有命名空间,如下所示的输出所示:
让我们添加一个第二个项目,以探索如何处理多个项目:
- 在终端中,切换到 Chapter01-vscode 目录,如下命令所示:
在终端中,创建一个名为 AboutMyEnvironment 的新控制台应用程序项目,使用较旧的非顶级程序风格,如以下命令所示:
良好实践:在终端中输入命令时要小心。在输入可能破坏性命令之前,请确保您在正确的文件夹中!
- 在终端中,使用 dotnet CLI 将新项目文件夹添加到解决方案中,如以下命令所示:
请注意结果,如下所示:
- 在解决方案资源管理器中,在 AboutMyEnvironment 项目中,打开 Program.cs ,然后在 Main 方法中,将现有语句更改为输出当前目录、操作系统版本字符串和 Program 类的命名空间,如以下代码所示:
- 在解决方案资源管理器中,右键单击 AboutMyEnvironment 项目中的任何文件,然后选择在集成终端中打开。
- 在终端中,输入命令以运行项目,如下命令所示: dotnet run 。
- 请注意 TERMINAL 窗口中的输出,如以下输出所示:
- 在解决方案资源管理器中,右键单击 AboutMyEnvironment 项目中的任何文件,然后选择在集成终端中打开。
- 在终端中,输入命令以运行项目,如下命令所示: dotnet run 。
- 请注意 TERMINAL 窗口中的输出,如以下输出所示:
一旦您打开多个终端窗口,您可以通过点击右侧面板中它们的名称在它们之间切换。默认情况下,名称将是常见的 shell 之一,如 pwsh、powershell、zsh 或 bash。右键单击并选择重命名以设置其他名称。
当 VS Code,或者更准确地说, dotnet CLI 运行控制台应用程序时,它是从 <projectname> 文件夹中执行的。Visual Studio 从 <projectname>\\bin\\Debug\\net9.0 文件夹中执行该应用程序。在后面的章节中,当我们处理文件系统时,记住这一点将非常重要。
如果您在 macOS Ventura 上运行该程序,环境操作系统将会不同,如以下输出所示:
良好实践:尽管源代码,如 .csproj 和 .cs 文件,是相同的,但编译器自动生成的 bin 和 obj 文件夹可能存在不匹配,从而导致错误。如果您想在 Visual Studio 和 VS Code 中打开相同的项目,请在其他代码编辑器中打开项目之前删除临时 bin 和 obj 文件夹。这个潜在问题就是我在本章中要求您为 VS Code 项目创建不同文件夹的原因。
按照以下步骤使用 VS Code 创建解决方案和项目,如表 1.5 所示:
表 1.5:使用 VS Code 创建解决方案和项目的步骤总结
控制台应用程序 / console 项目只是项目模板的一种。在本书中,您还将使用下表 1.6 中所示的以下项目模板创建项目:
表 1.6:各种代码编辑器的项目模板名称
将任何类型的新项目添加到解决方案的步骤是相同的。只有项目模板的类型名称不同,有时还有一些命令行开关用于控制选项。如果这些开关和选项与默认值不同,我将始终指定它们应该是什么。
项目模板默认值、选项和开关的摘要可以在这里找到:https://github.com/markjprice/cs13net9/blob/main/docs/ch01-project-options.md。
Git 是一个常用的源代码管理系统。GitHub 是一家公司、网站和桌面应用程序,使得管理 Git 变得更加容易。微软在 2018 年收购了 GitHub,因此它将与微软工具实现更紧密的集成。
我为这本书创建了一个 GitHub 仓库,并将其用于以下目的:
- 存储可以在印刷出版日期后维护的书籍解决方案代码。
- 提供额外的材料以扩展书籍,例如勘误修正、小改进、有用链接列表以及关于无法在印刷书中容纳的主题的可选部分。
- 为了给读者提供一个联系我的地方,以便他们在书籍上遇到问题时可以联系我。
良好实践:我强烈建议大家在尝试本书中的任何编码任务之前,先查看勘误表、改进、出版后更改和常见错误页面。您可以在以下链接找到它们:https://github.com/markjprice/cs13net9/blob/main/docs/errata/README.md。
本书的 GitHub 仓库中的解决方案代码包括每个章节的文件夹,可以使用以下任一代码编辑器打开:
- Visual Studio 或 Rider:打开 .sln 解决方案文件。
- VS Code:打开包含解决方案文件的文件夹。
第 1 到 11 章各自有一个名为 ChapterXX.sln 的解决方案文件,其中 XX 是章节编号 01 到 11。第 12 到 15 章共享一个名为 ModernWeb.sln 的解决方案文件。
.sln 解决方案文件格式是微软专有的文件格式,冗长、难以阅读,并使用全局唯一标识符 (GUID) 来引用项目和解决方案的其他组件。一个基于 XML 的新格式,旨在更简单、更易于阅读,即将推出,并将使用 .slnx 文件扩展名。您可以通过以下链接了解更多信息:https://github.com/dotnet/sdk/issues/40913。
VS Code 与 Git 集成,但它将使用您操作系统的 Git 安装,因此您必须先安装 Git 2 或更高版本,然后才能使用这些功能。
您可以从以下链接安装 Git: https://git-scm.com/download。
如果您喜欢使用图形用户界面,可以从以下链接下载 GitHub Desktop: https://desktop.github.com。
让我们克隆书籍解决方案代码库。在接下来的步骤中,您将使用 VS Code 终端,但您可以在任何命令提示符或终端窗口中输入命令:
- 在您的 user 或 Documents 文件夹中,或您想要存储 Git 仓库的任何地方创建一个名为 Repos-vscode 的文件夹。
- 在命令提示符或终端中打开 Repos-vscode 文件夹,然后输入以下命令:
请注意,克隆所有章节的所有解决方案将需要大约一分钟的时间,请耐心等待。
本节内容主要讲述如何在网上找到优质的编程信息。
获取有关 Microsoft 开发工具和平台帮助的权威资源在 Microsoft Learn 的技术文档中,您可以通过以下链接找到它:https://learn.microsoft.com/zh-cn/docs。
“One of the most ambitious and impactful projects our engineers have built recently is Ask Learn, an API that provides generative AI capabilities to Microsoft Q&A.” – Bob Tabor, Microsoft’s Skilling organization
您可以在以下链接中阅读相关内容:
https://devblogs.microsoft.com/engineering-at-microsoft/how-we-built-ask-learn-the-rag-based-knowledge-service/
官方的 Microsoft .NET 文档需要涵盖所有版本。文档中显示的默认版本始终是最新的 GA 版本。
例如,在 2024 年 11 月到 2025 年 11 月之间,文档页面中显示的默认版本将是.NET 9。在 2025 年 11 月到 2026 年 11 月之间,默认版本将是.NET 10。以下链接将根据当前日期自动指向当前版本:
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.stringsyntaxattribute
在 2025 年 11 月之后,要查看专门针对.NET 9 的文档页面,请在链接末尾添加 ?view=net-9.0 。例如,使用以下链接:
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.stringsyntaxattribute?view=net-9.0
本书中的所有文档链接均未指定版本。如果您想强制文档显示 .NET 8 的版本,因为您需要针对 LTS 版本(三年),而不是 STS 版本(18 个月)的 .NET 9,则在链接末尾添加 ?view=net-8.0 。
您可以通过在链接末尾添加 #applies-to 来检查 .NET 功能支持哪些版本,例如:
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.stringsyntaxattribute#applies-to
因此,我们可以看到 StringSyntax 属性仅在 .NET 7 或更高版本中可用。
在命令提示符下,您可以向 dotnet 工具请求有关其命令的帮助。语法是:
这将导致您的网页浏览器打开一个关于指定命令的文档页面。常见的 dotnet 命令包括 new 、 build 、 run 等等。
警告! dotnet help new 命令在 .NET Core 3.1 到 .NET 6 中有效,但在 .NET 7 或更高版本中返回错误: Specified command \’new\’ is not a valid SDK command. Specify a valid SDK command. For more information, run dotnet help. 希望 .NET 能尽快修复这个错误!
另一种帮助是命令行文档。它遵循以下语法:
例如, dotnet new -? 或 dotnet new -h 或 dotnet new –help 在命令提示符下输出有关 new 命令的文档。
如您现在所期待的, dotnet help help 为 help 命令打开一个网页浏览器,而 dotnet help -h 在命令提示符下输出 help 命令的文档!
让我们尝试一些例子:
- 要在网页浏览器窗口中打开 dotnet build 命令的官方文档,请在命令提示符或 VS Code 终端中输入以下内容,并注意在您的网页浏览器中打开的页面:
要在命令提示符下获取帮助输出,请使用 -? 、 -h 或 –help 标志,如以下命令所示:
您将看到以下部分输出:
- 重复以下命令的两种帮助请求: add , help , list , new 和 run ,请记住,由于.NET 7 中引入的一个错误, new 可能不会显示其网页。
代码编辑器最有用的功能之一是转到定义(F12)。它在 VS Code、Visual Studio 和 Rider 中可用。它将通过读取已编译程序集中的元数据来显示类型或成员的公共定义。
一些工具,例如 ILSpy .NET 反编译器,甚至会将元数据和 IL 代码反向工程回 C# 或其他语言。
一个类似且相关的功能被称为“转到实现”(Ctrl + F12)。它将显示实际的源代码(如果嵌入的话),而不是读取元数据或反编译,使用可选的源链接功能。
警告!“转到定义”应该转到成员或类型的反编译元数据。但是如果您之前查看过源链接,则会转到该链接。“转到实现”应该转到成员或类型的源链接实现。但是如果您已禁用源链接,则会转到反编译元数据。
让我们看看如何使用“转到定义”功能:
- 在您首选的代码编辑器中,打开名为 Chapter01 的解决方案/文件夹。
如果您正在使用 Visual Studio:
- 导航到 工具 | 选项。
- 在搜索框中输入 navigation to source 。
- 选择文本编辑器 | C# | 高级。
- 清除“启用导航到源链接和嵌入源”复选框,然后点击“确定”,如图 1.11 所示:
图 1.11:禁用“转到定义”功能的源链接
定义可以从元数据反向工程生成,或者如果启用的话,可以从原始源代码加载。就我个人而言,我发现元数据中的代码更有用,正如你即将看到的。在本节结束时,尝试将源链接选项重新打开,以查看差异。
- 在 HelloCS 项目中,在 Program.cs 的底部,输入以下语句以声明一个名为 z 的整数变量:
- 点击 int ,右键点击 int ,然后在 Visual Studio 或 VS Code 中选择转到定义。在 Rider 中,选择转到 | 转到声明或用法。
- 在出现的代码窗口中,您可以看到 int 数据类型是如何定义的,如下代码所示:
您可以看到 int :
- 使用 struct 关键字定义。
- 在 System.Runtime 程序集内。
- 在 System 命名空间中。
- 被命名为 Int32 。
- 因此,是 System.Int32 类型的别名。
- 实现接口,例如 IComparable 。
- 具有最大值( 2147483647 )和最小值( -2147483648 )的常量值。
- 具有如 Parse 等方法(在前面的代码中不可见)。
目前,“转到定义”功能对您来说并不是很有用,因为您还不知道这些信息的含义。在本书的第一部分结束时,该部分包括第 2 到第 6 章,并教授您 C#语言的知识,您将了解足够的信息,使此功能变得非常方便。
- 在代码编辑器窗口中,向下滚动以找到带有单个 string 参数的 Parse 方法,如下代码所示:
- 展开代码并查看记录此方法的注释,如图 1.12 所示:
图 1.12:带有单个字符串参数的 Parse 方法的注释
在评论中,您将看到微软已记录以下内容:
- 描述该方法的摘要。
- 可以传递给该方法的参数,如 string 值。
- 该方法的返回值,包括其数据类型。
- 调用此方法时可能发生的三个异常,包括 ArgumentNullException 、 FormatException 和 OverflowException 。现在,我们知道我们可以选择将对该方法的调用包装在 try 语句中,并选择要捕获的异常。
在本书的代码中,当调用一个方法时,我经常明确指定命名参数,以帮助您了解发生了什么。例如,我在以下代码中指定了参数 format 和 arg0 的名称:
内联提示,也称为嵌入提示,显示参数的名称,而无需您输入它们,如图 1.13 所示:
图 1.13:配置内联提示,即内嵌提示
大多数代码编辑器都有此功能,您可以永久启用或仅在按住像 Alt + F1 或 Ctrl 这样的键组合时启用:
- 在 Visual Studio 中,导航到工具 | 选项,然后选择文本编辑器 | C# | 高级,向下滚动到内联提示部分,选中显示内联参数名称提示复选框,然后点击确定。
- 在 VS Code 中,导航到 文件 | 首选项 | 设置,搜索 inlay ,选择 C# 过滤器,然后选中 显示内联参数名称提示 复选框。
- 在 Rider 中,进入设置,导航到 编辑 | 内联提示 | C# | 参数名称提示。
希望你迫不及待想知道这一切意味着什么!
再耐心等一会儿。你快要到达这一章的结尾了,在下一章中,你将深入了解 C#语言的细节。但首先,让我们看看你还可以在哪里寻求帮助。
Stack Overflow 是获取困难编程问题答案的最受欢迎的第三方网站。让我们看一个例子:
- 启动您最喜欢的网页浏览器。
- 导航到 stackoverflow.com ;在搜索框中输入 securestring 并注意搜索结果。
您可以使用高级搜索选项在 Google 上搜索,以增加找到所需内容的可能性:
- 请访问以下链接进入 Google: https://www.google.com/.
- 使用简单的 Google 查询搜索关于 garbage collection 的信息,并注意在看到计算机科学中垃圾收集的维基百科定义之前,您可能会看到很多关于您所在地区垃圾收集服务的广告!
- 通过将搜索限制在有用的网站上,例如 Stack Overflow,来改善搜索,去除我们可能不关心的语言,例如 C++、Rust 和 Python,或明确添加 C# 和 .NET,如以下搜索查询所示:
有时候,您可以通过观察微软团队如何实现 .NET 来学到很多东西。整个 .NET 代码库的源代码可以在公共 GitHub 仓库中找到。例如,您可能知道有一个内置属性用于验证电子邮件地址。
让我们在代码库中搜索“email”这个词,看看我们能否找出它是如何工作的:
- 使用您首选的网页浏览器导航到 https://github.com/search。
- 点击高级搜索。
- 在搜索框中,输入 email 。
- 在这些存储库框中,输入 dotnet/runtime 。(您可能想要搜索的其他存储库包括 dotnet/core 、 dotnet/aspnetcore 、 dotnet/wpf 和 dotnet/winforms 。)
- 在这个语言框中,选择 C#。
- 在页面右上角,注意高级查询是如何为您编写的。点击搜索,然后点击代码过滤器,注意结果包括 EmailAddressAttribute ,如图 1.14 所示:
图 1.14:在 dotnet/runtime 仓库中进行高级电子邮件搜索
点击源文件,并注意它通过检查 string 值包含 @ 符号但不作为第一个或最后一个字符来实现电子邮件验证,如以下代码所示:
关闭浏览器。
当您阅读 API 参考文档时,您通常希望查看实际的源代码。对于启用了 Source Link 的 .NET API,具有可访问的 PDB,并托管在公共 GitHub 存储库中的 API,源代码的链接会包含在定义元数据中。例如, String 类文档页面现在有这个新的源链接,它的 IndexOf 方法有一个指向其另一个源文件的源链接,如图 1.15 所示:
图 1.15:带有源文件链接的文档
近年来编码和开发领域最大的变化之一是生成性人工智能(AI)工具的出现,这些工具可以帮助完成编码任务,例如完成代码语句、实现整个函数、编写单元测试以及为现有代码建议调试修复。
您可以在 2023 年 Stack Overflow 开发者调查中阅读开发者对 AI 工具的看法:“44%的开发者现在在他们的开发过程中使用 AI 工具,26%计划很快使用”(https://stackoverflow.blog/2023/06/14/hype-or-not-developers-have-something-to-say-about-ai/):
“从研究到调试再到文档编写,开发者们正在使用生成式人工智能来节省在工作中处理各种繁琐任务的时间。最大的应用案例是编写代码。在最近的 Stack Overflow 开发者调查中,82.55%的开发者报告使用生成式人工智能。”
ChatGPT 目前为个人提供几种模型:4o mini(免费)、4o(免费但有限制)以及 4o,具有 5 倍的请求量和其他好处,如提前访问新功能和 DALL·E 图像生成(每月 20 美元)。它还为企业提供定价。您可以在以下链接查看他们的定价: https://openai.com/chatgpt/pricing/.
假设您需要编写一个 C# 函数来验证电子邮件地址。您可能会去 ChatGPT 并输入以下提示:
它以一个完整的类和方法进行响应,如图 1.16 所示:
图 1.16:ChatGPT 编写一个函数来验证电子邮件地址
它接着提供了代码的解释以及如何调用该函数的示例,如以下代码所示:
但像 ChatGPT 这样的通用生成式 AI 是 C# 程序员的最佳伙伴吗?
微软为程序员提供了一项专门的服务,名为 GitHub Copilot,可以直接在您的代码编辑器中帮助自动完成代码。它为代码编辑器提供了插件,包括 Visual Studio、VS Code 和基于 JetBrains IntelliJ 的 IDE。
我个人非常喜欢 Copilot 的品牌形象。它清楚地表明你是飞行员。你最终负责“驾驶飞机”。但对于简单或无聊的部分,你可以暂时把它交给你的副驾驶,同时随时准备在需要时重新掌控。
GitHub Copilot 对学生、教师和一些开源项目维护者免费。对于其他人,它提供 30 天的免费试用,之后个人每月收费 10 美元或每年 100 美元。一旦您拥有账户,就可以注册等待名单,以获取更高级的实验性 GitHub Copilot 功能。
您应该在线检查各种代码编辑器可用的 Copilot 功能。正如您所想,这个世界变化迅速,我今天在书中写的某些内容在您阅读时可能已经过时:https://github.com/features/copilot。
JetBrains 有自己的 GitHub Copilot 等效产品,名为 AI Assistant,您可以在以下链接中阅读相关内容:https://blog.jetbrains.com/idea/2023/06/ai-assistant-in-jetbrains-ides/.
那么今天 GitHub Copilot 能为您做些什么呢?
想象一下,您刚刚添加了一个名为 Product.cs 的新类文件。您点击 Product 类内部,按下 Enter 键插入一个空行,然后停顿一秒钟,思考您需要输入的内容……然后 GitHub Copilot 生成了一些灰色的示例代码,如图 1.17 所示:
图 1.17:GitHub Copilot 建议如何定义一个 Product 类
此时,您可以浏览代码,如果它接近您想要的,只需按 Tab 键插入全部,或按 Alt + .(点)在其他建议之间切换。
有时候,它离你所需的东西太远,你最好完全忽略它的建议,自己写。但是通常,它那里有一些可用的东西,或者让你想起你需要使用的语法。有时候,写出正好符合你需求的几十行代码,感觉就像魔法一样。
微软将其人工智能工具与公共 GitHub 存储库中的代码进行训练,包括我自 2016 年以来为本书所有版本创建的所有存储库。这意味着它可以为本书的读者提供出乎意料的准确代码补全建议,包括我在代码中频繁使用的流行文化引用。就像我,马克·J·普赖斯,是“机器中的幽灵”,引导你的编码。
很容易想象一个定制的 ChatGPT,它已经吸收了所有官方的 Microsoft .NET 文档、关于 .NET 的每一篇公开博客文章,甚至可能还有数百本关于 .NET 的书籍,然后与它进行对话以查找错误或建议如何解决编程问题。
您可以通过以下链接注册 GitHub Copilot: https://github.com/github-copilot/signup/.
良好实践:在以下链接了解如何将 Copilot 用作您的编码 GPS:https://devblogs.microsoft.com/visualstudio/using-github-copilot-as-your-coding-gps/.
这里有一些关于使用人工智能进行编码的更多链接:
- 初学者使用 GitHub Copilot 进行提示工程的指南: https://dev.to/github/a-beginners-guide-to-prompt-engineering-with-github-copilot-3ibp
- The Register 有关人工智能的文章:https://www.theregister.com/2024/01/27/ai_coding_automatic/
- StackOverflow 2024 调查 – 代码编辑器 / IDE: https://survey.stackoverflow.co/2024/technology#1-integrated-development-environment
- StackOverflow 2024 调查 – AI 搜索工具: https://survey.stackoverflow.co/2024/technology#1-ai-search-and-developer-tools
尽管这些工具可能很有帮助,但它们有时也会妨碍你,尤其是在学习时,因为它们有时会在不告诉你的情况下为你工作。如果你自己至少不做几次那项工作,你就无法完全学习。
在 Visual Studio 中配置 C#的 IntelliSense:
- 导航到 工具 | 选项。
- 在选项对话框树视图中,导航到文本编辑器 | C# | 智能感知。
- 点击标题栏中的 ? 按钮查看文档。
在 Visual Studio 中配置 GitHub Copilot:
- 导航到 工具 | 选项。
- 在选项对话框树视图中,导航到 GitHub | Copilot。
- 将全局启用设置为真或假,然后点击确定。
在 VS Code 中禁用 GitHub Copilot:
- 在状态栏的右侧,通知图标的左侧,点击 GitHub Copilot 图标。
- 在弹出窗口中,点击全局禁用。
- 要启用它,请再次点击 GitHub Copilot 图标,然后点击全局启用。
有关 Rider IntelliSense 的帮助,请参阅以下链接:https://www.jetbrains.com/help/rider/Auto-Completing_Code.xhtml。
现在让我们通过尝试回答一些问题、进行一些实践操作,以及更深入地探讨本章所涵盖的主题,来测试你的知识和理解。
在线材料可以是我为本书撰写的额外内容,也可以是对微软或第三方创建的内容的引用。
您可以在以下链接查看各种平台上最新的 .NET 版本以及官方支持的版本:https://versionsof.net。
如果您需要了解有关旧版 .NET Framework 的更多支持信息,可以通过以下链接阅读:https://learn.microsoft.com/en-us/lifecycle/products/microsoft-net-framework。
.NET 每年发布新版本。一些开发者在新版本发布后立即开始升级,而其他人则更喜欢等到当前版本达到支持结束时再升级。升级涉及几个重要的考虑因素,您可以在以下链接中阅读相关内容:
https://learn.microsoft.com/en-us/dotnet/core/install/upgrade
尝试回答以下问题,记住虽然大多数答案可以在本章中找到,但您应该进行一些在线研究或编写代码来回答其他问题:
- Visual Studio 比 VS Code 更好吗?
- .NET 5 及更高版本是否优于.NET Framework?
- 什么是 .NET Standard,它为什么仍然重要?
- 为什么程序员可以使用不同的语言(例如 C# 和 F#)来编写在 .NET 上运行的应用程序?
- 什么是顶级程序,如何访问任何命令行参数?
- .NET 控制台应用程序的入口点方法名称是什么,如果不使用顶级程序特性,应该如何显式声明?
- Program 类在顶级程序中定义在哪个命名空间?
- 您会在哪里寻找 C#关键字的帮助?
- 您首先会在哪里寻找常见编程问题的解决方案?
- 在让人工智能为您编写代码后,您应该做什么?
附录,知识测试问题的答案,可以从 GitHub 仓库的 README 文件中的链接下载:https://github.com/markjprice/cs13net9。
一本印刷书籍是一个精心策划的体验。我尝试找到在这本书中包含主题的正确平衡。我所写的其他内容可以在本书的 GitHub 仓库中找到。
我相信这本书涵盖了 C#和.NET 开发人员应该具备或了解的所有基本知识和技能。一些较长的示例最好作为链接包含到微软文档或第三方文章作者的内容中。
请使用以下页面上的链接了解本章所涵盖主题的更多细节:
https://github.com/markjprice/cs13net9/blob/main/docs/book-links.md#chapter-1—hello-c-welcome-net
在本章中,我们:
- 设置您的开发环境。
- 在一篇在线文章中讨论了现代 .NET、.NET Core、.NET Framework、Xamarin 和 .NET Standard 之间的相似性和差异。
- 使用 Visual Studio 和 VS Code 以及 .NET SDK CLI 创建了一些简单的控制台应用程序,并将其分组在一个解决方案中。
- 学习如何从该书的 GitHub 仓库下载解决方案代码。
- 学会了如何寻求帮助。这可以通过传统方式,例如使用帮助命令开关、文档和文章,或者通过现代方式,与编码专家 AI 进行对话或使用基于 AI 的工具来执行“繁琐工作”。
在下一章中,您将学习如何“说”C#。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。