摘要:本章主要介绍 C#编程语言的基础知识。在本章中,您将学习如何使用 C#的语法编写语句,并了解一些您每天都会使用的常见词汇。此外,在本章结束时,您将对如何在计算机内存中临时存储和处理信息感到自信。
本章主要介绍 C#编程语言的基础知识。在本章中,您将学习如何使用 C#的语法编写语句,并了解一些您每天都会使用的常见词汇。此外,在本章结束时,您将对如何在计算机内存中临时存储和处理信息感到自信。
本书的这一部分是关于 C#语言的——您每天将使用的语法和词汇,以编写应用程序的源代码。
编程语言与人类语言有许多相似之处,除了在编程语言中,你可以创造自己的词汇,就像苏斯博士一样!
在苏斯博士于 1950 年写的书《如果我经营动物园》中,他这样说:
“然后,为了给他们看看,我将航行到卡特鲁,并带回一个伊特库奇,一个普里普和一个普鲁,还有一个内克尔,一个神经病和一个西尔萨克!”
本书的这一部分涵盖了 C#编程语言,主要面向初学者,因此涵盖了所有开发人员需要了解的基本主题,包括声明变量、存储数据以及如何定义自己的自定义数据类型。
本书涵盖了 C#语言从版本 1 到最新版本 C# 13 的特性。您可以在以下链接阅读 C# 13 的新功能摘要:
如果您已经对旧版本的 C#有一些了解,并且对最新版本 C#中的新功能感到兴奋,我已经为您列出了语言版本及其重要的新功能,方便您跳转,同时附上了您可以学习这些内容的章节编号和主题标题。
您可以在以下链接的 GitHub 存储库中阅读此信息: https://github.com/markjprice/cs13net9/blob/main/docs/ch02-features.md。
多年来,微软向 ECMA 标准机构提交了几个版本的 C#。微软在 2014 年将 C#开源。您可以在以下链接阅读最新的 C#标准文档:https://learn.microsoft.com/en-us/dotnet/csharp/specification/。相比 ECMA 标准,更实用的是公共 GitHub 仓库,以尽可能开放的方式进行 C#及相关技术的工作,如表 2.1 所示:
描述链接C# 语言设计编译器实现标准以描述语言C# 和 Visual Basic 的 .NET 语言编译器,也称为 Roslyn,以及一个单独的 F# 编译器,作为 .NET SDK 的一部分进行分发。要使用特定版本的 C#,您必须至少安装该版本的 .NET SDK,如表 2.2 所示:
.NET SDK罗兹林编译器默认 C# 语言1.0.42.0–2.27.01.1.42.3–2.47.12.1.22.6–2.77.22.1.2002.8–2.107.33.03.0–3.48.05.03.89.06.04.010.07.04.411.08.04.812.09.04.1213.0表 2.2:.NET SDK 版本及其 C# 编译器版本
当您创建类库时,可以选择以 .NET Standard 以及现代 .NET 的版本为目标。它们具有默认的 C# 语言版本,如表 2.3 所示:
.NET StandardC#2.07.32.18.0表 2.3:.NET Standard 版本及其默认 C# 编译器版本
尽管您必须安装最低版本的 .NET SDK 才能访问特定的编译器版本,但您创建的项目可以针对旧版本的 .NET,并仍然使用现代编译器版本。例如,如果您安装了 .NET 9 SDK 或更高版本,则可以在针对 .NET 8 的控制台应用程序中使用 C# 13 语言特性。
让我们看看您可用的 .NET SDK 和 C# 语言编译器版本:
在 Windows 上,启动 Windows 终端或命令提示符。在 macOS 上,启动终端。要确定您可用的 .NET SDK 版本,请输入以下命令:dotnet --version请注意,发布时的版本为 9.0.100,表示这是 SDK 的初始版本,尚未进行任何错误修复或新功能,如以下输出所示:
9.0.100开发工具如 Visual Studio 和 dotnet命令行界面默认假设您希望使用最新的 C# 语言编译器的主要版本。在 C# 8 发布之前,C# 7 是最新的主要版本,并作为默认版本使用。
要在 C# 点版本如 7.1、7.2 或 7.3 中使用改进,您必须在项目文件中添加一个 配置元素,如下所示的标记所示:
7.3
在发布了带有 .NET 9 的 C# 13 之后,如果微软发布了 C# 13.1 编译器,并且您想使用其新的语言特性,那么您将需要在项目文件中添加一个配置元素,如下所示的标记所示:
的潜在值如表 2.4 所示:
描述7, 7.1, 7.2, 7.3, 8, 9, 10, 11, 12, 13输入特定的版本号将使用该编译器(如果已安装)。latestmajor使用最高的主要版本号,例如,2019 年 8 月为 7.0,2019 年 10 月为 8,2020 年 11 月为 9,2021 年 11 月为 10,2022 年 11 月为 11,2023 年 11 月为 12,以及 2024 年 11 月为 13。latest使用最高的主要版本号和最高的次要版本号,例如,2017 年的 7.2,2018 年的 7.3,2019 年的 8,以及 2025 年上半年的 13.1。preview使用最高可用的预览版本,例如,在 2025 年 7 月中旬安装了.NET 10 Preview 6 的 14 版本。表 2.4:项目文件的 LangVersion 设置
在 2025 年 2 月,微软可能会发布.NET 10 的第一个公共预览版,配备 C# 14 编译器。您将能够从以下链接安装其 SDK:
警告!该链接将在 2025 年 2 月之前出现 404 Missing resource 错误,因此在那之前请不要使用它!
安装 .NET 10 SDK 预览版后,您将能够使用它创建新项目并探索 C# 14 中的新语言特性。
在创建新项目后,您必须编辑 .csproj 文件并添加 元素,设置为 preview 以使用预览 C# 14 编译器,如下标记中突出显示的内容所示:
Exenet10.0preview良好实践:您应该仅将 设置为 preview 用于探索,而不是生产项目,因为这不受微软支持,并且更可能存在错误。微软提供预览版本是因为他们希望听取像您这样的开发者的反馈。通过这种方式,您可以成为 C#开发和改进的一部分。
.NET 9 附带 C# 13 编译器,但这并不意味着您只能使用 C# 13 编译器。一旦 .NET 10 SDK 在 2025 年 11 月正式发布,您将能够获得两全其美的体验。
您可以在项目继续针对 .NET 9 的同时使用 .NET 10 SDK 及其 C# 14 编译器。为此,请将目标框架设置为 net9.0 ,并添加一个 元素,设置为 14 ,如下所示的标记中突出显示:
Exenet9.0enableenable14前面的项目目标是 net9.0 ,因此在使用每月修补版本的.NET 9 运行时运行时,支持到 2026 年 5 月。如果前面的项目是使用.NET 10 SDK 构建的,则可以将 设置为 14 ,这意味着 C# 14。
如果您将目标设置为 net10.0 ,并且已安装 .NET 10 SDK,则默认情况下新项目的语言将是 C# 14,因此不需要显式设置。
在 2026 年 2 月,微软可能会发布.NET 11 的第一个预览版,而在 2026 年 11 月,它可能会发布.NET 11 的正式版供生产使用。您将能够从以下链接安装其 SDK,并以与上述描述的.NET 10 中 C# 14 相同的方式探索 C# 15:
再次,前面的链接是供将来使用的!在 2026 年 2 月之前,它将出现 404 Missing resource 错误,因此在那之前请不要使用前面的链接。
警告!某些 C# 语言特性依赖于底层 .NET 库的更改。即使您使用最新的 SDK 和最新的编译器,在针对旧版本 .NET 时,您可能无法使用所有新的语言特性。例如,C# 11 引入了 required 关键字,但在针对 .NET 6 的项目中无法使用,因为该语言特性需要仅在 .NET 7 中可用的新属性。幸运的是,如果您尝试使用不受支持的 C# 特性,编译器会警告您。请为这种情况做好准备。
我们将首先编写代码以显示编译器版本:
如果您已经完成了第 1 章《你好,C#! 欢迎,.NET!》,那么您将已经有一个 cs13net9 文件夹。如果没有,那么您需要创建它。使用您首选的代码编辑器创建一个新项目,如下列表所定义:项目模板:控制台应用程序 [C#] / console项目文件和文件夹: Vocabulary解决方案文件和文件夹: Chapter02请勿使用顶级语句:已清除启用原生 AOT 发布:已清除良好实践:如果您忘记了如何操作,或者没有完成上一章,那么在第 1 章《你好,C#! 欢迎,.NET!》中提供了创建多个项目解决方案的逐步说明。
在 Vocabulary 项目中,在 Program.cs ,在注释后添加一条语句以将 C#版本显示为错误,如以下代码所示:运行控制台应用程序:如果您正在使用 Visual Studio,请导航到 调试 | 不调试启动。当提示您继续并运行上一个成功的构建时,点击 否。如果您正在使用 VS Code,请在 Vocabulary 文件夹的终端中输入 dotnet run 命令。请注意,我们预期会出现编译错误,因此看到它时不要惊慌!请注意,编译器版本和语言版本显示为编译器错误消息编号 CS8304 ,如图 2.1 所示:图 2.1:显示 C# 语言版本的编译器错误
VS Code PROBLEMS 窗口或 Visual Studio 错误列表窗口中的错误消息显示 Compiler version: '4.12.0...' ,语言版本为 default (13.0) 。
注释掉导致错误的语句,如以下代码所示:// #error version请注意,编译器错误消息消失。让我们先来看看 C#的语法和词汇基础。在本章中,您将创建多个控制台应用程序,每个应用程序展示 C#语言的相关特性。
C# 的语法包括语句和代码块。要记录您的代码,您可以使用注释。
良好实践:注释不应是您记录代码的唯一方式。为变量和函数选择合理的名称、编写单元测试以及创建实际文档是记录代码的其他方式。
在英语中,我们用句号表示句子的结束。一个句子可以由多个单词和短语组成,单词的顺序是语法的一部分。例如,在英语中,我们说“the black cat”。
形容词“黑色”位于名词“猫”之前。然而,法语语法的顺序不同;形容词位于名词之后:“le chat noir。”重要的是要明白,顺序是重要的。
C# 用分号表示语句的结束。一个语句可以由多种类型、变量和由标记组成的表达式构成。每个标记由空格或其他可识别的不同标记分隔,例如运算符= 或 + 。
例如,在以下语句中, decimal 是一个类型, totalPrice 是一个变量, subtotal + salesTax 是一个表达式:
decimal totalPrice = subtotal + salesTax;该表达式由一个名为 subtotal 的操作数、一个操作符 + 和另一个名为 salesTax 的操作数组成。操作数和操作符的顺序很重要,因为顺序会影响含义和结果。
注释是记录代码的主要方法,以增强对其工作原理的理解,供其他开发人员阅读,或供您在几个月后回来看时阅读。
在第 4 章,编写、调试和测试函数中,您将学习以三个斜杠开头的 XML 注释 /// ,并使用一个工具生成网页以记录您的代码。
您可以使用双斜杠 // 添加注释以解释您的代码。编译器将忽略 // 之后的所有内容,直到行末,如以下代码所示:
// Sales tax must be added to the subtotal.decimal totalPrice = subtotal + salesTax;要编写多行注释,请在注释的开头使用 /* ,在注释的结尾使用 */ ,如以下代码所示:
/*This is amulti-line comment.*/尽管 /* */ 主要用于多行注释,但它在语句中间进行注释时也很有用,如以下代码所示:
decimal totalPrice = subtotal /* for this item */ + salesTax;良好实践:设计良好的代码,包括具有良好命名参数的函数签名和类封装,可以在一定程度上自我文档化。当你发现自己在代码中添加了过多的注释和解释时,问问自己:我能否重写,也就是重构这段代码,使其在没有长篇注释的情况下更易于理解?
您的代码编辑器具有命令,可以更轻松地添加和删除注释字符,如下所示:
Visual Studio:导航到 编辑 | 高级 | 注释选择 或 取消注释选择。VS Code:导航到 编辑 | 切换行注释或切换块注释。骑手:导航到代码 | 使用行注释或使用块注释进行注释。良好实践:您通过在代码语句上方或后添加描述性文本来注释代码。您通过在语句前或周围添加注释字符来注释掉代码,使其无效。取消注释意味着删除注释字符。
在英语中,我们通过开始新的一行来表示新段落。C# 使用大括号 { } 来表示代码块。
块以声明开始,以指示正在定义的内容。例如,块可以定义许多语言构造的开始和结束,包括命名空间、类、方法或像 foreach 这样的语句。
您将在本章及后续章节中进一步了解命名空间、类和方法,但现在简要介绍一下这些概念:
命名空间包含类型,如类,以将它们组合在一起。一个类包含一个对象的成员,包括方法。一种方法包含实现对象可以采取的动作的语句。像 Visual Studio、Rider 和 VS Code 这样的代码编辑器提供了一个方便的功能,可以通过在代码左边距上移动鼠标光标时切换指向下方或右侧的箭头符号来折叠和展开代码块,如图 2.2 所示:
图 2.2:具有展开和折叠块的代码编辑器
您可以在任何您想要的语句周围定义自己的标记区域,然后大多数代码编辑器将允许您以与块相同的方式折叠和展开它们,如以下代码所示:
#region Three variables that store the number 2 million.int decimalNotation = 2_000_000;int binaryNotation = 0b_0001_1110_1000_0100_1000_0000;int hexadecimalNotation = 0x_001E_8480;#endregion通过这种方式,区域可以被视为注释块,可以折叠以显示该块的摘要。
我将在 GitHub 仓库的解决方案代码中使用 #region 块,特别是在我们开始定义作为自然可折叠区域的函数之前的早期章节,但我不会在印刷书中显示它们以节省空间。请根据自己的判断决定是否在自己的代码中使用区域。
在一个不使用顶级程序特性的简单控制台应用程序中,我在语句和代码块中添加了一些注释,如下所示:
using System; // A semicolon indicates the end of a statement.namespace Basics{ // An open brace indicates the start of a block.class Program{static void Main(string args){Console.WriteLine("Hello World!"); // A statement.}}} // A close brace indicates the end of a block.请注意,C# 使用一种大括号风格,其中打开和关闭的大括号各占一行,并且位于相同的缩进级别,如以下代码所示:
if (x其他语言如 JavaScript 使用大括号,但格式不同。它们将开放大括号放在声明语句的末尾,如以下代码所示:
if (x您可以使用您喜欢的任何风格,因为编译器并不在乎。
有时,为了在印刷书籍中节省垂直空间,我使用 JavaScript 的大括号风格,但大多数情况下我坚持使用 C#的大括号风格。我使用两个空格而不是更常见的四个空格进行缩进,因为我的代码将被印刷在书中,因此可用的宽度较窄。
更多信息:官方编码风格规范可以在以下链接找到:https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions。
无论任何官方指南,我建议您遵循您的开发团队所采用的标准,除非您是独立开发者,在这种情况下,只要您的代码可以编译,您可以使用任何您喜欢的约定。不过,请对未来的自己友好,无论如何保持一致性!
良好实践:在微软官方文档中使用的括号风格是 C#中最常用的。例如,请参见 for 语句,详见以下链接:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/iteration-statements。
空白字符包括空格、制表符和换行符。您可以随意使用空白字符来格式化代码,因为额外的空白字符对编译器没有影响。
警告!除非逐步说明告诉读者输入代码,否则代码示例是为了阅读和理解,而不是输入到代码编辑器中。
以下四个语句都是等价的。由于这四个语句都是等价的,它们都有相同的变量名,因此不能在同一个代码块中全部声明,所以请不要尝试输入这段代码,除非您也更改这三个 sum 变量名:
int sum = 1 + 2; // Most developers would prefer this format.intsum=1+2; // One statement over three lines.int sum= 1 +2;int sum=1+2; // Two statements on one line.在前面的语句中,唯一需要的空白字符是在 int 和 sum 之间的一个空白字符,以告诉编译器它们是独立的标记。任何单个空白字符(例如,空格、制表符或换行符)都是可以接受的。
更多信息:您可以在以下链接阅读 C# 空白的正式定义:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#634-white-space。
理解 C#词汇C# 词汇由关键字、符号字符和类型组成。
在本书中,您将看到并频繁使用的一些预定义的保留关键字包括 using 、 namespace 、 class 、 static 、 int 、 string 、 double 、 bool 、 if 、 switch 、 break 、 while 、 do 、 for 、 foreach 、 this 和 true 。
警告! this 关键字可以以多种方式使用,包括引用对象的当前实例、在当前对象实例上调用构造函数以及定义索引器。所有三种情况的示例将在第 5 章中介绍,主题为使用面向对象编程构建您自己的类型。
您将看到的一些符号字符是 " 、 ' 、 + 、 - 、 * 、 / 、 % 、 @ 和 $ 。
“括号”符号包括以下内容:
被称为括号。它们用于调用函数、定义表达式或条件,以及在类型之间进行转换。{} 被称为大括号(也称为花括号)。它们用于定义代码块以及执行对象和集合的初始化。 被称为括号(也称为方括号)。它们用于访问数组或集合中的项目,以及装饰代码元素的属性。 被称为尖括号。它们用于泛型类型、XML 和 HTML 文件中,并单独作为表达式中的小于或大于符号。还有其他上下文关键字,仅在特定上下文中具有特殊含义,例如 and 、 or 、 not 、 record 和 init 。
然而,这仍然意味着该语言中只有大约 100 个实际的 C#关键字。
良好实践:C# 关键字使用全小写。虽然您可以为自己的类型名称使用全小写,但不应该这样做。在 C# 11 及更高版本中,如果您这样做,编译器会发出警告,如以下输出所示: Warning CS8981 The type name 'person' only contains lower-cased ascii characters. Such names may become reserved for the language.
如果您想使用 C# 关键字来命名变量,可以通过在其前面加上 @ 符号来实现,如以下代码所示:
// Prefix with @ to use a C# keyword as a variable name.strin0g @class = "A poorly named variable!";int @if = 5;良好实践:虽然您可以使用 C# 关键字作为变量名,但应避免这样做,因为这是一种不良实践。对于多个 C# 版本,微软希望在语言中添加一个新关键字 field ,但他们不愿意这样做,因为一些开发人员可能会有名为 field 的变量,这将对那些项目造成破坏性更改。
英语语言有超过 250,000 个不同的单词,那么 C#为什么只需要大约 100 个关键字就能运作?此外,如果 C#仅占英语单词数量的 0.0416%,为什么它如此难以学习?
人类语言和编程语言之间的一个关键区别是,开发人员需要能够定义具有新含义的新“词”。除了 C#语言中大约 100 个关键字外,本书还将教你关于其他开发人员定义的数十万个“词”的一些知识,同时你也将学习如何定义自己的“词”。
世界各地的程序员必须学习英语,因为大多数编程语言使用英语单词,如“if”和“break”。虽然有些编程语言使用其他人类语言,如阿拉伯语,但它们很少。如果您有兴趣了解更多,这个 YouTube 视频展示了一种阿拉伯编程语言的演示:https://www.youtube.com/watch?v=EwYIZBL4sAU。
默认情况下,Visual Studio 和 VS Code 将 C# 关键字显示为蓝色,以便于与其他代码(默认为黑色)区分。这两个工具都允许您自定义颜色方案。
在 Visual Studio 中:
导航到 工具 | 选项。在选项对话框中,在环境部分,选择字体和颜色,然后选择您想要自定义的显示项。您也可以搜索该部分,而不是浏览。在 VS Code 中:
导航到 文件 | 首选项 | 主题 | 颜色主题。它在 macOS 的代码菜单中。选择一个颜色主题。作为参考,我将使用 Light+(默认浅色)颜色主题,以便截图在印刷书籍中看起来更好。在 Rider 中,导航到 文件 | 设置 | 编辑器 | 颜色方案。
普通文本编辑器如记事本并不能帮助你写出正确的英语。同样,记事本也无法帮助你写出正确的 C#代码。
Microsoft Word 可以通过用红色波浪线突出拼写错误来帮助您写英语,Word 会提示“icecream”应该是 ice-cream 或 ice cream,以及用蓝色波浪线标出语法错误,例如句子应该以大写字母开头。
同样,Visual Studio 和 VS Code 的 C# 扩展通过突出显示拼写错误(例如,方法名称需要以大写 L 开头的 WriteLine )和语法错误(例如,语句必须以分号结束)来帮助您编写 C# 代码。
C# 扩展不断监视您输入的内容,并通过用彩色波浪线突出显示问题来给您反馈,类似于 Microsoft Word 的功能。
让我们看看它的实际效果:
图 2.3:错误列表窗口显示两个编译错误
修复两个编码错误。System 是一个命名空间,类似于类型的地址。要准确地引用某人的位置,您可能会使用 Oxford.HighStreet.BobSmith ,这告诉我们在牛津市的高街上寻找名为 Bob Smith 的人。
System.Console.WriteLine 告诉编译器在名为 System 的命名空间中查找名为 Console 的类型中的名为 WriteLine 的方法。
为了简化我们的代码,所有版本的 .NET 在 6.0 之前的控制台应用程序项目模板在代码文件的顶部添加了一条语句,告诉编译器始终在 System 命名空间中查找未带命名空间前缀的类型,如下代码所示:
using System; // Import the System namespace.我们称之为导入命名空间。导入命名空间的效果是,该命名空间中所有可用类型将可供您的程序使用,而无需输入命名空间前缀。在您编写代码时,该命名空间中的所有可用类型将在 IntelliSense 中显示。
传统上,每个需要导入命名空间的 .cs 文件都必须以 using 语句开始以导入这些命名空间。像 System 和 System.Linq 这样的命名空间几乎在所有 .cs 文件中都是必需的,因此每个 .cs 文件的前几行通常至少有几个 using 语句,如以下代码所示:
using System;using System.Linq;using System.Collections.Generic;在使用 ASP.NET Core 创建网站和服务时,通常每个文件需要导入数十个命名空间。
C# 10 引入了一种新的关键字组合,而 .NET SDK 6 引入了一种新的项目设置,这两者协同工作以简化导入常用命名空间。
global using 关键字组合意味着您只需在一个 .cs 文件中导入一个命名空间,它将在所有 .cs 文件中可用,而不必在每个需要它的文件顶部导入命名空间。您可以在 Program.cs 文件中放置 global using 语句,但我建议为这些语句创建一个名为 GlobalUsings.cs 的单独文件,内容为您所有的 global using 语句,如以下代码所示:
global using System;global using System.Linq;global using System.Collections.Generic;良好实践:随着开发人员逐渐习惯这个新的 C# 特性,我预计这个文件的命名约定将成为事实上的标准。正如您即将看到的,相关的 .NET SDK 特性使用了类似的命名约定。
任何针对 .NET 6 或更高版本的项目,因此使用 C# 10 或更高版本的编译器,会在 obj\Debug\net9.0 文件夹中生成一个 .GlobalUsings.g.cs 文件,以隐式全局导入一些常见的命名空间,如 System 。隐式导入的命名空间的具体列表取决于您所针对的 SDK,如表 2.5 所示:
SDK隐式导入的命名空间Microsoft.NET.Sdk
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading
System.Threading.Tasks
Microsoft.NET.Sdk.Web
与 Microsoft.NET.Sdk 相同,另外:
System.Net.Http.Json
Microsoft.AspNetCore.Builder
Microsoft.AspNetCore.Hosting
Microsoft.AspNetCore.Http
Microsoft.AspNetCore.Routing
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
Microsoft.NET.Sdk.Worker
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
表 2.5:.NET SDK 及其隐式导入的命名空间
让我们看看当前自动生成的隐式导入文件:
在解决方案资源管理器中,切换打开“显示所有文件”按钮,注意编译器生成的 bin 和 obj 文件夹现在可见。在 Vocabulary 项目中,展开 obj 文件夹,展开 Debug 文件夹,展开 net9.0 文件夹,然后打开名为 Vocabulary.GlobalUsings.g.cs 的文件。该文件的命名约定为 .GlobalUsings.g.cs 。请注意 g 表示生成,以便将其与开发者编写的代码文件区分开。
请记住,此文件是由编译器为目标为 .NET 6 及更高版本的项目自动创建的,并且它导入了一些常用的命名空间,包括 System.Threading ,如下代码所示:// global using global::System;global using global::System.Collections.Generic;global using global::System.IO;global using global::System.Linq;global using global::System.Net.Http;global using global::System.Threading;global using global::System.Threading.Tasks;关闭 Vocabulary.GlobalUsings.g.cs 文件。关闭 Vocabulary.GlobalUsings.g.cs 文件。在解决方案资源管理器中,打开 Vocabulary.csproj 项目文件,然后向项目文件添加额外条目,以控制哪些命名空间被隐式导入,如以下标记中突出显示的内容所示:Exenet9.0enableenable
请注意 与 是不同的。确保使用正确的一个!另外,请注意项目组或项目项中的元素顺序并不重要。例如, 可以在 之前或之后。
保存对项目文件的更改。展开 obj 文件夹,展开 Debug 文件夹,展开 net9.0 文件夹,并打开名为 Vocabulary.GlobalUsings.g.cs 的文件。请注意,此文件现在导入 System.Numerics 而不是 System.Threading , Environment 类已被导入并别名为 Env ,我们已静态导入 Console 类,如以下代码中所示高亮部分:// global using global::System;global using global::System.Collections.Generic;global using global::System.IO;global using global::System.Linq;global using global::System.Net.Http;global using global::System.Numerics;global using global::System.Threading.Tasks;global using Env = global::System.Environment;global using static global::System.Console;在 Program.cs 中,添加一个语句以输出来自计算机的消息,并注意由于我们静态导入了 Console 类,我们可以像 WriteLine 一样调用它的方法,而无需在前面加上 Console ,并且我们可以使用其别名 Env 引用 Environment 类,如以下代码所示:WriteLine($"Computer named {Env.MachineName} says \"No.\"");运行项目并注意消息,如以下输出所示:Computer named DAVROS says "No."您的计算机名称将会不同,除非您像我一样以《神秘博士》中的角色为您的计算机命名。
您可以通过从项目文件中完全删除 元素,或将其值更改为 disable ,来禁用所有 SDK 的隐式导入命名空间功能,如下所示的标记所示:
disable良好实践:如果您想手动创建一个包含所有 global using 语句的单个文件,而不是可能自动生成一个文件和其他手动创建的文件,您可以选择这样做。但我的建议是保持该功能启用,并修改项目文件以更改在 obj 文件夹层次结构中包含的内容。
来源:广西客家人