C# 方法(局部变量和局部常量)
本章内容:
方法的结构
方法体内部的代码执行
局部变量
局部常量
控制流
方法调用
返回值
返回语句和void方法
局部函数
参数
值参数
引用参数
引用类型作为值参数和引用参数
输出参数
参数数组
参数类型总结
方法重载
命名参数
可选参数
栈帧
递归
局部变量
和第5章介绍的字段一样,局部变量也保存数据。字段通常保存和对象状态有关的数据,而创
建局部变量经常是用于保存局部的或临时的计算数据。表6-1对比了局部变量和实例字段的差别。
下面这行代码展示了局部变量声明的语法。可选的初始化语句由等号和用于初始化变量的值
组成。
下面这行代码展示了局部变量声明的语法。可选的初始化语句由等号和用于初始化变量的值
组成。
下面的示例展示了两个局部变量的声明和使用。第一个是int类型变量,第二个是SomeClass
类型变量。
static void Main()
{int myInt=15;SomeClass sc=new SomeClass();...
}
类型推断和var关键字
如果观察下面的代码,你会发现在声明的开始部分提供类型名时,你提供的是编译器能从初
始化语句的右边推断出来的信息。
在第一个变量声明中,编译器能推断出15是int型。
在第二个声明中,右边的对象创建表达式返回了一个MyExcellentClass类型的对象
所以在两种情况中,在声明的开始部分包括显式的类型名是多余的。
static void Main()
{int total=15;MyExcellentClass mec=new MyExcellentClass();...
}
为了避免这种冗余,可以在变量声明的开始部分的显式类型名的位置使用新的关键字var,
static void Main()
{//var关键字var total=15;var mec=new MyExcellentClass();...
}
var关键字并不是表示特殊变量。它只是句法上的速记,表示任何可以从初始化语句的右边推
断出的类型。在第一个声明中,它是int的速记;在第二个声明中,它是MyExcellentClass的速记。
前文中使用显式类型名的代码片段和使用var关键字的代码片段在语义上是等价的。
使用var关键字有一些重要的条件:
只能用于局部变量,不能用于字段;
只能在变量声明中包含初始化时使用;
一旦编译器推断出变量的类型,它就是固定且不能更改的。
说明 var关字不像JavaScript的var那样可以引用不同的类型。它是从等号右边推断出的实
际类型的速记。var关撻字并不改变C#的强类型性质。
嵌套块中的局部变量
方法体内部可以嵌套其他的块。
可以有任意数量的块,并且它们既可以是顺序的也可以是嵌套的。块可以嵌套到任何级别。
局部变量可以在嵌套块的内部声明,并且和所有的局部变量一样,它们的生存期和可见
性仅限于声明它们的块及其内嵌块。
图6-3阐明了两个局部变量的生存期,展示了代码和栈的状态。箭头标出了刚执行过的行。
变量var1声明在方法体中,在嵌套块之前。
变量var2声明在嵌套块内部。它从被声明那一刻开始存在,直到声明它的那个块的尾部
结束。
当控制传出嵌套块时,它的局部变量从栈中弹出。
说明 在C和C++中,可以先声明一个局部更量,然后在嵌套块中声明另一个名称相同的局部
变量。在内部范围,内部称掩盖了外部名称。然而,在c#中不管嵌套级别如何,都不
能在第一个称的有效范围内声明另一个同名的局部变量
局部常量
局部常量很像局部变量,只是一旦被初始化,它的值就不能改变了。如同局部变量,局部常
量必须声明在块的内部。
常量的两个最重要的特征如下。
在声明时必须初始化。
在声明后不能改变。
常量的核心声明如下所示。
语法与字段或变量的声明相同,只有如下两点不同。
在类型之前增加关键字const。
必须有初始化语句。初始化值必须在编译期决定,通常是一个预定义简单类型或由其组
成的表达式。它还可以是null引用,但它不能是某对象的引用,因为对象的引用是在运
行时决定的。
说明 关键字const不是修饰符,而是核心声明的一部分。它必须直接放在类型的前面。
就像局部变量,局部常量声明在方法体或代码块里,并在声明它的块结束的地方失效。例如,
在下面的代码中,类型为内嵌类型double的局部常量PI在方法DisplayRadii结束后失效。
void DisplayRadii()
{const double PI=3.1416; //声明局部常量for(int radius=1;radius<=5;radius++){double area=radius*radius*PI;//读取局部常量Console.WriteLine($"Radius:{radius},Area:{area}");}}