变量类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、变量类型
C#共有七种变量类型:静态变量,实例变量,数组元素,数值参数,引用参数,输出参数和局部变量。下面的部分将分别对每一种变量类型做相关描述。
举个例子:
class A
{
public static int x;
int y;
void F(int[] v, int a, ref int b, out int c) {
int i=1;
c=a+b++;
}
}
x 是一个静态变量,y 是一个实例变量,v[0]是一个数组元素,a 是数值参数,b 是引用参数,c 是一个输出参数,i是一个局部变量。
1.1 静态变量
使用static修饰符定义的变量称为静态变量。静态变量在被创建并加载后生效,当被卸载后失效。
静态变量的初始值为此类型变量的默认值。
为了方便明确赋值检查,静态变量被认为是初始化过的。
1.2 实例变量
一个没有static 修饰符声明的域被称为实例变量。
1.2.1 类中的实例变量
当创建某类的一个实例的时候,隶属于该类的实例变量也被生成,当不再有关于这个实例的引用而且实例的析构函数执行了以后,此实例变量失效。类中实例变量的初始值为这种类型变量的默认值
为了方便进行明确赋值检查,类中的实例变量是初始化过的。
1.2.2 结构体中的实例变量
一个结构体中的实例变量与隶属与该结构体的结构体变量寿命相同。换句话说,结构体中的实例变量和其中的其他变量一样被同时创建,并且同时失效。而且该结构体中的实例变量的初始赋值状态和其中的其余变量一致。当一个结构体变量被是初始化过的,结构体的实例变量也是如此;反过来说,如果一个结构体变量是没有经初始化的时,结构体的实例变量也是没有经初始化的。
1.3 数组元素
当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对这个数组实例的引用时,它的元素也就此失效。
数组中每个元素的初始值为该数字元素类型的默认值。为了方便明确赋值检查,所有的数字元素都会被认为是初始化的。
1.4 数值参数
当一个不带有ref 或out 修饰参数被声明时,我们称它为数值参数。
当被隶属的函数子句function member(method, constructor, accessor, operator )调用时,数值参数自动生成,同时被赋以调用中的参数值。当函数成员返回后,数值参数失效。
为了方便明确赋值检查,所有的数值参数都被认为是初始化过的。
1.5 引用参数
当一个带有ref 修饰语的参数被声明时,我们称之为引用参数。
引用参数本身并不创建新的存储空间。同时,引用参数指向函数子句调用中作为参数给出的相关变量表征的存储空间。这样,此形式参数的数值总是等于它所指向的变量。
下面时关于引用参数的赋值规则。请注意它们同下面所说的输出参数相关规则的区别。在一个变量被传递给函数子句调用中相关引用参数之前,它自身必须被明确赋值。
在函数子句界定的范围内,引用参数被认为是初始化过的。
在结构体类型的方法实例或存取程序实例中,关键字this 就象是此结构体类型的引用参数,相关的应用我们在后面还会继续说到。
1.6 输出参数
当一个带有out 修饰语的参数被声明时,我们称之为输出参数。
输出参数本身并不创建新的存储空间。同时,输出参数指向函数子句调用中作为参数给出的相关变量表征的存储空间。这样,此输出参数的数值总是等于它所指向的变量。
下面时关于输出参数的赋值规则。请注意它们后面所说的形式参数相关规则的区别。
在一个变量被传递给函数子句调用中相关输出参数之前,它自身不需要被明确地赋值。
在函数子句调用中,每个被传递给输出参数的变量被认为在该执行路径中已被赋值。
在函数子句界定的范围内,输出参数被认为是初始化过的。
在函数子句返回之前,每一个输出参数必须被明确地赋值。
在结构体类型的构造函数中,关键字this 就象是此结构体类型的输出参数。
1.7 局部变量
局部变量被局部变量声明语句创建,该语句可以在block 块,for 循环语句或者switch 分支语句中出现。当控制权进入block 块, for 循环语句或者switch 分支语句时,其中的相关局部变量被创建。当控制权离开block 块, for 循环语句或者switch 分支语句时,其中的相关局部变量随即失效。
局部变量不会被自动初始化,也就是说它不会有缺省值。为了方便明确赋值检查,局部变量被认为是初始化过的。局部变量声明语句可以包括一个变量初始化器,此时该变量在除它的变量初始化器表达式内的完全的有效范围中被认为是明确赋值的。
在一个局部变量的有效范围中,在它被声明之前的所有关于它的引用都被是错误的。