C#(C、C++和Java也一样)是一种块结构语言(block structured language)。如本章前文所言,代码块即用大括号{…}包括起来的0行或多行代码。
l 方法声明,如SimpleProgram的Main方法,定义了一个块。
l 类声明,如SimpleProgram类,也定义了一个块。
l 如你所见,许多流程控制语句都定义了代码块。
块可以嵌套至任意层级。
public class SimpleProgram
{
// 在一个类代码块中(1层深度)。
static void Main() {
// 在Main方法代码块中(2层深度)。
int x = 3;
int y = 4;
int z = 5;
if (x > 2) {
// 在嵌套代码块中(第3层)。
if (y > 3) {
// 在另一嵌套代码中(第4层)。
// (可以不断深入!)
} // 完结第4层代码块。
// (可以在第3层填入其他代码。)
} // 第3层结束!
// (可以在第2层填入其他代码。)
} // 第2层结束!
// (可以在第1层填入其他代码。)
} // 啊,朋友再见!第1层才结束。
变量名作用范围是代码的一部分,在其范围内,变量名称对编译器是已定义的,该范围从首次被声明起,至在其中被声明的代码块里最近的结束(右)大括号为止。只有在变量被声明的代码块中,变量才“在界内”。一旦程序执行退出某个代码块,则该代码块中声明的任何变量都会越界,不再能为程序所用。
为了演示变量的作用范围,我们来写个叫做ScopeDemo的程序。ScopeDemo类声明三个嵌套的代码块:一个是ScopeDemo类声明,一个是Main方法,还有一个是Main方法内部的if语句。
public class ScopeDemo
{
static void Main() {
double cost = 2.65;
if (cost < 5.0) {
double discount = 0.05; // 在if代码块内部声明变量
// other details omitted ...
}
// 当if块退出时,变量discount超出作用范围并
// 不再能为编译器所识别。如果试图在后面的
// 语句中使用,编译器将产生错误。
double refund = cost * discount; // 此行不能被编译
} // 变量discount超出作用范围
}
在上例中,一个叫做cost的变量在Main方法体的代码块中被声明。另一个叫做discount的变量则在if语句代码块中被声明。当if语句代码块退出时,discount变量超出作用范围。之后若是在程序中试图存取discount变量,如下所示:
double refund = cost * discount;
编译器就会产生错误:
error: CS0103: The aame'discount'does not exist in the class or namespace’ScopeDemo’。
注意,在外层代码块中声明的变量能被声明语句后面的任何内层代码块所用。例如,在上面的ScopeDemo例子里,变量cost可以被声明语句后面的嵌套if语句代码块存取。