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

fub*_*ubo 6 c# try-catch

我得到了以下代码

截图

为什么在finally块中的x值为5而不是"已经定义"或者默认值为0?

Dmi*_*nko 7

在你的情况下,生命周期x是在{...}块内try; 但是,由于.Net中的局部变量没有零初始化,下一个包含前值的垃圾xx

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; 
   ...
}
Run Code Online (Sandbox Code Playgroud)

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中声明的局部变量的范围是声明发生的块 ...


usr*_*usr 5

我猜你已经设置了一个断点,finally然后看了一下x.x没有根据C#语言规范的值,但调试器可能会查看第一个存储位置x并向您显示其值.

在真正的代码,你将无法读取xfinally.

调试器不遵守语言规则.