回答
我想你已经在finally
中设置了一个断点,并且看着x
。根据C#语言规范,x
没有任何价值,但调试器可能会查看第一个存储位置,并向您显示其价值。
在实际代码中,您将无法从x
中读取finally
。
调试器不遵守语言规则。
你可能是使用visual studio调试器,它在变量名称上继电器值为watch,还有一些如何显示错误的值,在这种混乱的情况下。
变量x
的范围仅限于try
块而已, 是调试器显示如果您尝试使用x
变量,你将面对你所提到的问题,值5,但 。
试试这个:
finally
{
int x;
Console.Write(x); //error use of unassigned local variable
}
的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
...在局部变量声明声明的局部变量的范围是该声明所在块...
你有没有从MSDN的参考,说明局部变量未初始化。我认为'JIT'使用'default()',但编译器强制初始化以避免错误的代码。 – ja72
他们有一个默认值http://stackoverflow.com/questions/2929257/value-of-unassigned-non-nullable-variable-c(见Skeet的答案) – fubo
@fubo:a * quote from the answer:“for字段,*不是局部变量 - 只有在分配给它们之后才能被读取* ... int的值为0 ...“ 斜体是我的(Dmitry Bychenko)。请注意,*局部变量*(不同于*字段*)不会被零初始化 –
为什么一直在finally- X阻止值1,而不是“已定义 ”或具有默认值0?
你看到的是调试器连接符号。它根本没有任何价值,事实上,如果你尝试并使用它,你会得到一个未分配的变量错误。
现在为什么不显示为已经定义的是另一个问题。答案是{}
定义了声明空间。(在C#中,变量是在分支级别定义的,而不是函数级别)。他们在两个不同的申报空间,这就是为什么它被允许。第一个x
不能溢出到第二个x
被定义的位置。
你有什么比
void foo() {
var x = 2;
if (true){
var x = 3;
}
}
这是不允许的不同。
- 1. 最终局部变量的寿命
- 2. C++全局变量使用寿命
- 3. C堆栈/范围,功能后变量的寿命结束
- 4. 简单猜谜游戏的最后一次尝试的X变量变化,C++
- 5. 常量参数寿命在C++
- 6. 寿命(C++ 14)
- 7. IntentService中成员变量的寿命
- 8. C# - 尝试捕获,最后在返回
- 9. 尝试引用一个动态命名变量,SASS
- 10. ASP.NET - 剃刀静态变量寿命?
- 11. 在Java方法最后一个变量
- 12. 尝试块后无法找到变量
- 13. 尝试打印一个变量时尝试打印一个变量时发生Java错误
- 14. 寿命从全局矢量
- 15. C++寿命内置集合
- 16. C++ Boost.Asio物体寿命
- 17. 寿命
- 18. 第一和最后一个整词在一个变量
- 19. 尝试使用一个变量来自不同的查询命令查询
- 20. 入门尝试一个AttributeError时IntVar()分配给一个变量
- 21. 虽然XSLT变量是不可变的,但是尝试增加一个变量
- 22. 性状与寿命由一个参数的寿命有界返回迭代
- 23. 尝试存储在一个向量
- 24. 如何使re.search()尝试一个最好的尝试方法
- 25. 命名的变量在C
- 26. SSIS - 尝试在postexecute中分配一个变量不起作用?
- 27. 在尝试创建一个JFileChooser - 公共变量?
- 28. ,C,碰撞,同时尝试删除列表中的最后一个元素
- 29. 行为与尝试的一个synchronized方法,最后
- 30. Android库类的静态变量的寿命是多少?
这很有趣,调试器的确显示了1.尽管如此,你不能在finally块中使用'x',finally {int x; int y = x; }'不会编译。 –