详析 c#中的变量

上传人:豆浆 文档编号:31978663 上传时间:2018-02-09 格式:DOCX 页数:8 大小:24.54KB
返回 下载 相关 举报
详析 c#中的变量_第1页
第1页 / 共8页
详析 c#中的变量_第2页
第2页 / 共8页
详析 c#中的变量_第3页
第3页 / 共8页
详析 c#中的变量_第4页
第4页 / 共8页
详析 c#中的变量_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《详析 c#中的变量》由会员分享,可在线阅读,更多相关《详析 c#中的变量(8页珍藏版)》请在金锄头文库上搜索。

1、5. 变量5.1 变量类型5.1.1 静态变量5.1.2 实例变量5.1.3 数组元素5.1.4 数值参数5.1.5 引用参数5.1.6 输出参数5.1.7 局部变量5.2 默认值5.3 明确赋值5.3.1 初始赋值变量5.3.2 非初始赋值变量5.4 变量引用变量变量代表数据的实际存储位置。每各变量所能存储的数值由它本身的类型决定。C语言是一种类型安全语言(typesafe language,TSL),而且C编译器保证每一个数值被保存在相应的变量中。变量的数值可以通过赋值或者或-运算符改变。在变量被赋值以前,变量自身的类型必须被明确地声明。在下面的章节中我们会提到,变量或者被初始化的或者未初

2、始化的。一个初始化的变量在被定义时被赋予了一个确定的初始值,而未初始化的变量在定义时并未被赋予确定的初始值。对于一个在程序某处被认为具有确定数值的IUA,必然在指向这一位置的所有可能的执行路径上存在赋值操作。 5.1 变量类型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是一个实例变量,v0

3、是一个数组元素,a是数值参数,b是引用参数,c 是一个输出参数,i是一个局部变量。5.1.1 静态变量使用static修饰符定义的变量称为静态变量。静态变量在被创建并加载后生效,当被卸载后失效。静态变量的初始值为此类型变量的默认值(参见错误!未找到引用源。节)。为了方便明确赋值检查,静态变量被认为是初始化过的。 5.1.2 实例变量 一个没有 static 修饰符声明的域被称为实例变量。5.1.2.1 类中的实例变量当创建某类的一个实例的时候,隶属于该类的实例变量也被生成,当不再有关于这个实例的引用而且实例的析构函数执行了以后,此实例变量失效。类中实例变量的初始值为这种类型变量的默认值(5.2

4、) 。为了方便进行明确赋值检查,类中的实例变量是初始化过的。 5.1.2.2 结构体中的实例变量一个结构体中的实例变量与隶属与该结构体的结构体变量寿命相同。换句话说,结构体中的实例变量和其中的其他变量一样被同时创建,并且同时失效。而且该结构体中的实例变量的初始赋值状态和其中的其余变量一致。当一个结构体变量被是初始化过的,结构体的实例变量也是如此;反之如果一个结构体变量是未经初始化的时,结构体的实例变量也是未经初始化的。 5.1.3 数组元素 当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对这个数组实例的引用时,它的元素也就此失效。 数组中每个元素的初始值为该数字元素类型

5、的默认值。为了方便明确赋值检查,所有的数字元素都被认为是初始化的。 5.1.4 数值参数 当一个不带有 ref 或 out 修饰参数被声明时,我们称它为数值参数。 当被隶属的函数子句 function member(method, constructor, accessor, operator)调用时,数值参数自动生成,同时被赋以调用中的参数值。当函数成员返回后,数值参数失效。 为了方便明确赋值检查,所有的数值参数都被认为是初始化过的。 5.1.5 引用参数 当一个带有 ref 修饰语的参数被声明时,我们称之为引用参数。 引用参数本身并不创建新的存储空间。同时,引用参数指向函数子句调用中作为参

6、数给出的相关变量表征的存储空间。这样,此形式参数的数值总是等于它所指向的变量。 下面时关于引用参数的赋值规则。请注意它们同5.1.6 节中所给出的输出参数相关规则的区别。 在一个变量被传递给函数子句调用中相关引用参数之前,它自身必须被明确赋值,详见5.3。 在函数子句界定的范围内,引用参数被认为是初始化过的。 在结构体类型的方法实例或存取程序实例中,关键字 this 就象是此结构体类型的引用参数,详见7.5.7。 5.1.6 输出参数 当一个带有 out 修饰语的参数被声明时,我们称之为输出参数。 输出参数本身并不创建新的存储空间。同时,输出参数指向函数子句调用中作为参数给出的相关变量表征的存

7、储空间。这样,此输出参数的数值总是等于它所指向的变量。 下面时关于输出参数的赋值规则。请注意它们同5.1.5 节中所给出的形式参数相关规则的区别。 在一个变量被传递给函数子句调用中相关输出参数之前,它自身不需要被明确地赋值,详见5.3 节。 在函数子句调用中,每个被传递给输出参数的变量被认为在该执行路径中已被赋值。 在函数子句界定的范围内,输出参数被认为是初始化过的。 在函数子句返回之前,每一个输出参数必须被明确地赋值,详见5.3 节。 在结构体类型的构造函数中,关键字 this 就象是此结构体类型的输出参数,详见7.5.7 节。 5.1.7 局部变量 局部变量被局部变量声明语句创建,该语句可

8、以在 block 块,for 循环语句或者switch 分支语句中出现。当控制权进入 block 块, for 循环语句或者 switch 分支语句时,其中的相关局部变量被创建。当控制权离开 block 块, for 循环语句或者 switch 分支语句时,其中的相关局部变量随即失效。 局部变量不会被自动初始化,也就是说它不会有缺省值。为了方便明确赋值检查,局部变量被认为是初始化过的。局部变量声明语句可以包括一个变量初始化器,此时该变量在除它的变量初始化器表达式内的完全的有效范围中被认为是明确赋值的。 在一个局部变量的有效范围中,在它被声明之前的所有关于它的引用都被是错误的。 5.2 默认值

9、下面几种类型的变量在初始化时被自动赋予相应的默认值: 静态变量 类实例中的实例变量 数组元素 变量的默认值直接取决于它自身的类型和下面几种因素: 对于数值型的变量,默认值就是被此数值类型构造函数计算时使用的数值,详见4.1.1 节。 对于形式型变量,默认值为 null。 5.3 明确赋值 在一个特定的函数子句可执行代码位置,如果通过静态流分析某一个变量被编译器证明为被自动初始化或者为至少一条赋值语句的执行对象,那么该变量将被认为是明确赋值的。关于明确赋值的相关规则如下所示: 一个初始化过的变量(详见5.3.1 节)被认为是明确赋值的。 对于一个在特定位置的未初始化的变量(详见5.3.2 节)

10、,如果所有可能的指向该位置的执行路径满足以下若干条件中的任何一个,那么它也被认为是明确赋值的: a 在某一个赋值语句中该变量作为左操作数出现,详见7.13.17 节。 b 任何一个调用表达式(详见7.5.5 节)或者目标创建表达式(详见7.10.1 节)将该变量作为一个输出参数传递。 c 作为局部变量,该变量的局部变量声明语句包含变量初始化器。 一个结构体类型的实例变量的明确赋值状态将同时被单独和共同跟踪。另外,除了声明的各项规则之外,下面的各项规则适用于结构体类型变量和它们的实例变量: 如果一个实例变量中包含被明确赋值的结构体类型变量,则该变量被认为是明确赋值。 如果一个结构体类型的变量中的

11、所有实例变量都被认为是明确赋值的,那么这个结构体变量也是明确赋值的。 明确赋值是下列各项的前提: 任何时刻,当一个变量 获得自身的值时,它就是明确赋值的。这样就可以杜绝不确定的数值出现。除去下列情况,表达式中的变量都会获得相关变量数值: a 变量作为简单赋值语句的左操作数。 b 变量作为一个输出参数被传递 c 变量作为结构体类型的变量并在成员访问中作为左操作数出现。 当变量被作为形式参数被传递时,它本身必须是被明确赋值的。这样才能确保被调用的函数子句认为该形式参数是被明确赋值的。 无论函数子句在何处返回(通过返回语句return 和程序执行到函数子句的末尾),所有函数子句中的输出参数都必须是被

12、明确赋值的。这样就确保函数子句不会返回不具备明确数值的输出参数,也就使编译器认为函数子句把某一变量当作输出参数等同于都给变量赋值。 结构体类型的构造函数自何处返回,其中的this变量都必须使被明确赋值的。 下面的例程告诉我们try语句的不同block会使如何影响明确赋值的。 class Astatic void F()int i, j; try / neither i nor j definitely assignedi = 1;/ i definitely assigned j = 2;/ i and j definitely assigned catch / neither i nor j

13、 definitely assigned i = 3;/ i definitely assigned finally / neither i nor j definitely assignedi = 4;/ i definitely assignedj = 5;/ i and j definitely assigned / i and j definitely assigned静态流分析在检测明确赋值状态使将考虑&,|,?:这些运算符的特殊运算。在下面例程中的每一个 method 我们将会看到class Astatic void F(int x, int y)int i; if (x = 0

14、& (i = y) = 0) / i definitely assigned else / i not definitely assigned / i not definitely assigned static void G(int x, int y)int i; if (x = 0 | (i = y) = 0) / i not definitely assigned else / i definitely assigned / i not definitely assigned 变量 i 在 if 语句中的一个嵌套语句中是被明确赋值的,而在其余位置并不如此。在 F method 中的 if

15、 语句的第一个嵌套语句中,因为表达式 iy 被事先执行,所以变量 i 在是被明确赋值的。而在这个 if 语句的第二个嵌套语句中,由于变量 i 未被赋值,所以它被认为是未被明确赋值的。请注意,如果变量 x 的数值是负的,那么变量 i 是不会被赋值的。同样,在 G 方法中,变量 i 在第二个嵌套语句中是被明确赋值的而在第一个嵌套语句中并不是这样。 5.3.1 初始赋值变量 下面所列各种类型的变量属于初始赋值变量: 静态变量 类实例中的实例变量 被初始赋值的结构体类型变量中的实例变量 数组元素 数值参数 形式参数 5.3.2 非初始赋值变量下面类型的变量属于非初始赋值变量: 未被初始赋值的结构体变量中的实例变量 输出参数,包括结构体construc到r中的this变量 局部变量 5.4 变量引用 变量引用(variable-reference)是一种我们归类为变量的表达式。变量引用指向一个特定的存储地址,我们可以从这里获得它存储的当前值或者存入一个新的数值。在C和C中变量引用被称作lvalue(左值)。 变量引用: 表达式 下面的结构需要一个表达式充当变量引用: 赋值表达式的左侧(可以是属性获取或索引获取程序)。 一个在方法或构造函数构造器调用中作为ref 或out 参数被传递的变量

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号