练习 - 了解方法范围
for 循环、 if-else 语句和方法都表示不同类型的代码块。 每个代码块都有自己的“范围”。 “Scope”是可访问特定数据的程序的区域。 在方法或任何代码块中声明的变量只能在该区域内访问。 随着程序变得更加复杂,此模式可帮助程序员一致地使用明确命名的变量并维护易于阅读的代码。
在本练习中,你将使用不同类型的方法和变量来详细了解方法范围。
测试变量范围
在任何代码块之外声明的语句称为顶级语句。 在顶级语句中声明的变量称为“全局变量”。 全局变量不限于任何范围,并且可以在整个程序中的任意位置使用。 全局变量对于需要访问相同数据的不同方法非常有用。 但是,请务必注意不同范围中的变量名称。
在 Visual Studio Code 编辑器中,删除前面练习中的任何现有代码。
在 Visual Studio Code 编辑器中输入以下代码:
string[] students = {"Jenna", "Ayesha", "Carlos", "Viktor"}; DisplayStudents(students); DisplayStudents(new string[] {"Robert","Vanya"}); void DisplayStudents(string[] students) { foreach (string student in students) { Console.Write($"{student}, "); } Console.WriteLine(); }在此代码中,你将创建一个全局
students数组,以及一个接受同名参数的方法DisplayStudents。保存并运行代码以观察以下输出:
Jenna, Ayesha, Carlos, Viktor, Robert, Vanya,请注意,方法参数
student优先于全局student数组。 必须仔细考虑想要使用的方法的全局变量。删除前面的代码。
在编辑器中输入以下代码:
PrintCircleArea(12); void PrintCircleArea(int radius) { double pi = 3.14159; double area = pi * (radius * radius); Console.WriteLine($"Area = {area}"); }此代码计算并显示圆区。
尝试通过更新代码来引用方法中的
PrintCircleArea变量,如下所示:PrintCircleArea(12); double circumference = 2 * pi * radius;出现错误消息,告知你当前范围中不存在名称
pi和radius。 这些变量仅存在于PrintCircleArea方法范围内。删除不正确的代码并添加以下代码:
void PrintCircleCircumference(int radius) { double pi = 3.14159; double circumference = 2 * pi * radius; Console.WriteLine($"Circumference = {circumference}"); }由于变量
pi设置为相同的固定值并在这两种方法中使用,因此此值非常适合用于全局变量。 在此示例中,radius不是全局变量,因此你可以调用具有不同值radius的方法,而无需每次更新变量。将代码更新为以下内容:
double pi = 3.14159; void PrintCircleArea(int radius) { double area = pi * (radius * radius); Console.WriteLine($"Area = {area}"); } void PrintCircleCircumference(int radius) { double circumference = 2 * pi * radius; Console.WriteLine($"Circumference = {circumference}"); }现在,这两种方法都可以引用相同的值,
pi而无需定义该值。 你可能已经猜到方法可以调用其他方法。 通常,只要方法在程序范围内定义,就可以在任意位置调用该方法。将新方法添加到代码,如下所示:
double pi = 3.14159; PrintCircleInfo(12); PrintCircleInfo(24); void PrintCircleInfo(int radius) { Console.WriteLine($"Circle with radius {radius}"); PrintCircleArea(radius); PrintCircleCircumference(radius); }在此代码中,你将创建一个新方法来
PrintCircleInfo调用现有方法。radius的值也会被传递给每个方法。 创建模块化方法有助于使代码保持井然有序且易于阅读。保存并运行代码以观察以下输出:
Circle with radius 12 Area = 452.38896 Circumference = 75.39815999999999 Circle with radius 24 Area = 1809.55584 Circumference = 150.79631999999998
回顾
下面介绍了到目前为止已了解的方法范围:
- 在方法内声明的变量只能访问该方法。
- 在整个程序中都可以访问在顶级语句中声明的变量。
- 方法无权访问在不同方法中定义的变量。
- 方法可以调用其他方法。