练习 - 代码块和变量范围
- 11 分钟
代码块是定义执行路径的一个或多个 C# 语句。 代码块外部的语句会影响在运行时执行该代码块的时间、确定性和频率。 代码块的边界通常由大括号 {} 定义。
除了会影响执行路径外,代码块还会影响变量的范围。 在本练习中检查的代码示例可帮助了解代码块与变量范围之间的关系。
代码块影响变量声明的范围
变量范围是指变量对应用程序中其他代码的可见性。 局部变量只能在定义它的代码块内进行访问。 如果尝试在代码块外部访问变量,则将出现编译器错误。
本单元的其余部分探讨了代码块与变量范围之间的关系。
准备编码环境
本模块包括指导你完成生成和运行演示代码的过程的动手活动。 建议使用 Visual Studio Code 作为开发环境来完成这些活动。 使用 Visual Studio Code 来完成这些活动将帮助你在供全球专业人员使用的开发人员环境中更舒适地编写和运行代码。
打开 Visual Studio Code。
可以使用 Windows“开始”菜单(或等效资源 [对于其他 OS])打开 Visual Studio Code。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在“打开文件夹”对话框中,导航到 Windows“桌面”文件夹。
如果使用了其他文件夹位置来保存代码项目,可以改用该文件夹位置。 对于此训练,重要的是要有一个容易找到和记住的位置。
在“打开文件夹”对话框中,选择“选择文件夹”。
如果看到一个询问是否信任作者的安全对话框,请选择“是”。
在 Visual Studio Code 的“终端”菜单上,选择“新终端”。
请注意,“终端”面板中的命令提示符显示当前文件夹的文件夹路径。 例如:
C:\Users\someuser\Desktop>注意
如果你在自己的电脑上工作,而不是在沙盒或托管环境中工作,并且你已经完成此 C# 系列中的其他 Microsoft Learn 模块,那么你可能已经为代码示例创建了一个项目文件夹。 如果是这种情况,可以跳过下一步,该步骤用于在 TestProject 文件夹中创建控制台应用。
在终端命令提示符下,若要在指定文件夹中创建新的控制台应用程序,请输入以下提示:
dotnet new console -o ./CsharpProjects/TestProject此 .NET CLI 命令使用 .NET 程序模板在指定文件夹位置创建新的 C# 控制台应用程序项目。 该命令会自动创建 CsharpProjects 和 TestProject 文件夹,并使用 TestProject 作为
.csproj文件的名称。如果显示一条消息,告知文件已存在,请继续执行后续步骤。 你将重复使用现有的项目文件。
在 EXPLORER 视图中,展开 CsharpProjects 文件夹。
应会看到 TestProject 文件夹和两个文件:一个名为Program.cs的 C# 程序文件和一个名为 TestProject.csproj 的 C# 项目文件。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在 “打开文件夹 ”对话框中,选择 CsharpProjects 文件夹,然后选择“ 选择文件夹”。
在 EXPLORER 视图中,展开 TestProject 文件夹,然后选择 Program.cs。
删除现有代码行。
在本模块中,你将使用此 C# 控制台项目来创建、生成和运行代码示例。
关闭“终端”面板。
在代码块内部创建变量
首先,你将查看在代码块中初始化变量的情况。
确保已打开 Visual Studio Code,并且“编辑器”面板中显示了 Program.cs。
注意
Program.cs 应为空。 如果不是,请选择并删除所有代码行。
在 Visual Studio Code 编辑器中键入以下代码:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); }在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在生成或运行代码之前,必须保存 Program.cs 文件。
在“资源管理器”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。
终端面板将打开。 终端面板应包含一个命令提示符,显示“终端”已打开并转到 TestProject 文件夹位置。
在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。
注意
如果看到一条指示“找不到要运行的项目”的消息,请确保终端命令提示符显示预期的 TestProject 文件夹位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>应会看到以下输出:
Inside the code block: 10
这是预期的输出。 但如果要在 value 语句代码块外部访问变量 if,该怎么办?
尝试访问声明它的代码块之外的变量
在 Visual Studio Code 编辑器中,在
if语句代码块下方创建一个新代码行。在创建的空白代码行上,添加以下代码行:
Console.WriteLine($"Outside the code block: {value}");验证更新后的代码是否如下所示:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); } Console.WriteLine($"Outside the code block: {value}");保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run以运行代码。请注意,在尝试运行应用程序时,会收到编译错误:
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
消息的 Program.cs(7,46) 部分会告知该错误与 Program.cs 文件中第 7 行(第 46 列)有关。
之所以会生成此错误是因为在代码块内声明的变量只能在该代码块内访问(只能看到)。 由于在声明变量的代码块之外无法访问变量,因此无法从代码的第 7 行访问 value。
在方法代码块中声明的变量称为局部变量。 查看讨论变量范围的文章时,可能会看到所使用的术语局部变量。
在代码块上方移动变量声明
要访问代码块内外的变量,需要在代码块之前(以上)声明变量,以便代码块外部的代码可以“看到”变量。
在 Visual Studio Code 编辑器中更新代码,如下所示:
bool flag = true; int value; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");花点时间查看更新。
请注意,
value现在是在if代码块的外部声明(但未实例化)。使用 Visual Studio Code 保存更新,然后运行代码。
请注意,仍会出现编译错误。
此次,在尝试运行应用程序时,出现以下编译错误:
Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'该错误与代码块中的第 6 行相关联,因为
value未取消初始化(尚未分配值)。 如果代码行value = 10;位于if语句代码块上方,则应用程序将正确编译,并且一切正常。 但由于value尚未初始化,因此无法在代码块内访问它。确保在尝试访问变量之前初始化变量将解决此问题。
将变量初始化为变量声明的一部分
要将
value初始化为变量声明的一部分,请按如下所示更新代码:bool flag = true; int value = 0; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");此代码通过将
value初始化为变量声明的一部分解决了“未分配的局部变量”编译错误。使用 Visual Studio Code 保存和运行代码。
请注意,现在会在运行应用程序时看到以下输出:
Inside the code block: 0 Outside the code block: 10
检查编译器对代码的解释
为了帮助你避免运行时错误,C# 编译器会在 Visual Studio Code 编辑器和生成过程中分析代码。 但编译器可能并不总是以与你相同的方式解释代码。
请考虑以下两个代码示例,它的似乎具有相同的目的:
// Code sample 1
bool flag = true;
int value;
if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;
if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
你可能认为这两个示例应始终生成相同的结果,但 C# 编译器会以不同的方式解释这两个代码示例。
对于第一个代码示例,编译器会将 flag 解释为布尔变量,该变量可以赋值 true 或 false。 编译器的结论是,如果 flag 为 false,则在执行第二个 value 时时,将不会初始化 Console.WriteLine()。 从本质上讲,编译器会考虑以下两个可能的代码执行路径:
// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
和
// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");
由于编译器认为第二个路径是可能的(对于代码示例 1),因此它会在生成过程中生成错误消息。 此外,Visual Studio Code 中的代码编辑器会通过在 value 下显示红色波浪线(代码块下方 )来向你发出此问题的警告。
对于第二个代码示例,编译器的结论是将始终执行 if 语句代码块的内容(true 始终为 true)。 编译器将不会生成构建错误,因为它将第二个代码示例解释为具有单个执行路径,如下所示:
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
概括
下面是有关代码块的几个需要记住的重要事项:
- 在代码块内声明变量时,其可见性对该代码块为本地,并且不能在代码块之外访问该变量。
- 要确保变量在代码块内外都可见,必须在代码块前面(代码块外部和上方)声明该变量。
- 确保在代码尝试访问变量之前初始化变量(对于所有可能的代码执行路径)。