前面的不多做介绍,从本地变量开始。
下面的示例展示了本地变量的声明和使用,第一个是INT类型的变量,第二个是SomeClass类型变量:
和字段一样,本地变量也保存数据。字段通常保存和对象相关的数据,而本地变量用于保存本地的或临时的计算数据,下表对比了本地变量和实例字段的差别:
实例字段 本地变量
生存期 从实例被创建时开始知道实例不再被访问结束 从它在块中被声明的那点开始在块完成执行时结束
隐式初始化 初始化成该类型的默认值 没有隐式初始化,如果变量在使用前没有赋值,编译器会报错
存储区域 类的所有字段都存储在堆里,无论它是值类型还是引用类型 值类型:栈 引用类型:引用在栈里,数据在堆里
类型推断和VAR关键字
观察下面代码,你会发现当你在声明的开始部分提供类型名时,你提供的是编译器能从初始化语句的右边推断出来的信息。
- 在第一个变量声明中,编译器能推断出15是INT型
- 在第二个声明中,右手边的对象创建表达式返回了一个MyExcellentClass类型的对象。
所以在两种情况中,声明的开始部分包括显示的类型名是多余的。
从C#3.0开始,可以在变量声明的开始部分的显式类型名的位置使用新的关键字var,如:
使用var关键字的重要条件:
- 只能用于本地变量,不能用于字段
- 只能在变量声明中包含初始化时使用
- 一旦编译器推断出类型,它就是固定不变的
嵌套块中的本地变量
方法体内部可以嵌套其他的块。
- 可以有任意数量的块,并且他们既可以是顺序的也可以更深层嵌套的。块可以嵌套到任何嵌套到任何级别。
- 本地变量可以在嵌套块的内部声明,并且和所有的本地变量一样,它们的生存期仅限于声明它们的块及其内嵌块。
下图阐明了两个本地变量的生存期,展示了代码和栈的状态。箭头标出了刚执行过的行。
- 变量var1声明在方法体中,在嵌套块之前。
- 变量var2声明在嵌套块内部,它从被声明那一刻开始存在,直到声明它的那个块尾部结束。
- 当控制传出嵌套块时,它的本地变量被从栈中弹出。
说明:
在C和C++中,可以先定义一个本地变量,然后在嵌套块中定义另个相同的本地变量。在内部范围,内部名称掩盖了外部名称。然而,在C#中不管嵌套级别如何,都不能在第一个名称的有效范围内声明另一个同名的本地变量。
本地常量
本地常量很像本地变量,只是一旦它被初始化,它的值就不能被改变,如同本地变量,本地常量必须声明在块的内部。
常量的两个最最要的特征如下;
- 常量在声明中必须初始化
- 常量在声明后不能改变
常量的核心声明如下所示。语法与字段或变量的声明相同,除了下面内容:
- 在类型之前增加关键字const。
- 必须有初始化语句。初始化值必须在编译期决定,通常是一个预定义简单类型或由其组成的表达式,它还可以是null引用,但它不能是某对象的引用,因为对象的引用是在运行时决定的。
说明:
const不是一个修饰符,而是核心声明的一部分,它必须直接放在类型的前面。
const Type Identifier = Value;
关键字 初始化值是必须的
就像本地变量,本地常量声明在方法体或代码块里,并在声明它的块结束的地方失效。例如,在下面的代码中,本地常量pi在方法DisplayRadii结束后失效。
控制流