[英]C# lifetime of a variable in try finally
我得到了以下代码
为什么在finally块中的x值为5而不是“已经定义”或者默认值为0?
x
的生命周期在{...}
块内, try
在你的情况下; 但是,由于.Net中的局部变量没有零初始化 ,下一个x
包含前x
值的垃圾
try
{
int x = 5;
}
finally
{
// x is re-declared; since x is local it contains trash;
// former x was aquired at the stack, so .Net just moves stack pointer
// and doesn't remove former x value
int x;
...
}
http://msdn.microsoft.com/en-us/library/aa691170(v=vs.71).aspx
...局部变量不会自动初始化 ,因此没有默认值 ...
http://msdn.microsoft.com/en-us/library/aa664742(v=vs.71).aspx
...在local-variable-declaration中声明的局部变量的范围是声明发生的块 ...
我猜你已经在finally
设置了断点并查看了x
。 根据C#语言规范, x
没有值,但调试器可能会查看第一个x
具有的存储位置并向您显示其值。
在实际代码中,您将无法在finally
读取x
。
调试器不遵守语言规则。
你可能会使用visual studio调试器,它会在值变量名称上传递值,而在某些混乱情况下会显示错误值。
变量x
的范围仅限于try
block,yes Debugger显示值5但是如果你尝试使用x
变量,你将面临你提到的问题。
尝试这个:
finally
{
int x;
Console.Write(x); //error use of unassigned local variable
}
为什么在finally块中的x值为1而不是“已定义”或默认值为0?
您所看到的是连接符号的调试器。 它根本没有值,事实上如果你尝试使用它,你会得到一个未分配的变量错误。
现在为什么它没有显示已经定义的另一个问题。 答案是{}
定义声明空间。 (在C#变量中,在分支级别定义,而不是在函数级别定义)。 它们位于两个不同的声明空间中,这就是它被允许的原因。 第一个x
无法溢出到定义第二个x
位置。
你拥有的不同于
void foo () {
var x = 2;
if (true){
var x = 3;
}
}
这是不允许的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.