2014-03-31 21 views
6

我得到了下面的代码在尝试一个变量的C#寿命最后

screenshot

为什么在最后块具有x中的值5,而不是beeing“已定义”或具有默认值0的?

+3

这很有趣,调试器的确显示了1.尽管如此,你不能在finally块中使用'x',finally {int x; int y = x; }'不会编译。 –

回答

5

我想你已经在finally中设置了一个断点,并且看着x。根据C#语言规范,x没有任何价值,但调试器可能会查看第一个存储位置,并向您显示其价值。

在实际代码中,您将无法从x中读取finally

调试器不遵守语言规则。

1

可能是使用visual studio调试器,它在变量名称上继电器值为watch,还有一些如何显示错误的值,在这种混乱的情况下。

0

变量x的范围仅限于try块而已, 是调试器显示如果您尝试使用x变量,你将面对你所提到的问题,值5,但 。

试试这个:

finally 
{ 
    int x; 
    Console.Write(x); //error use of unassigned local variable 
} 
7

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

...在局部变量声明声明的局部变量的范围是该声明所在块...

+0

你有没有从MSDN的参考,说明局部变量未初始化。我认为'JIT'使用'default()',但编译器强制初始化以避免错误的代码。 – ja72

+0

他们有一个默认值http://stackoverflow.com/questions/2929257/value-of-unassigned-non-nullable-variable-c(见Skeet的答案) – fubo

+0

@fubo:a * quote from the answer:“for字段,*不是局部变量 - 只有在分配给它们之后才能被读取* ... int的值为0 ...“ 斜体是我的(Dmitry Bychenko)。请注意,*局部变量*(不同于*字段*)不会被零初始化 –

0

为什么一直在finally- X阻止值1,而不是“已定义 ”或具有默认值0?

你看到的是调试器连接符号。它根本没有任何价值,事实上,如果你尝试并使用它,你会得到一个未分配的变量错误。

现在为什么不显示为已经定义的是另一个问题。答案是{}定义了声明空间。(在C#中,变量是在分支级别定义的,而不是函数级别)。他们在两个不同的申报空间,这就是为什么它被允许。第一个x不能溢出到第二个x被定义的位置。

你有什么比

void foo() { 
var x = 2; 

if (true){ 
    var x = 3; 
} 

} 

这是不允许的不同。