繁体   English   中英

最后尝试C#的变量生命周期

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM