for (int i = 0; i < 10; i++)
{
int taco;
var randy = new Random();
taco = randy.Next();
}
我很困惑为什么taco保留了一个价值。基本上,如果我把断点放在&#34; int taco&#34;在第一次迭代中我可以看到并且看到taco是0.在第二次迭代时,当我检查它时,taco具有上一次迭代的值,我可以在立即窗口中使用它。有人可以告诉我为什么会这样吗?
答案 0 :(得分:5)
在taco
的声明(和初始化)之后,将断点放在 next 行上。
我对
taco
保留值的原因感到困惑。
它没有保留该值,您只是看到调试器的机制尚未在循环的下一次迭代中看到声明和初始化。它仍然在查看taco
占用的相同内存位置,但taco
在概念上不保留该值,因为您无法在代码中使用它。
请注意,现在,在您的代码中,您实际上错过了您在文本中声明的初始化。如果继续作为编写的代码,调试器将展示显示上一循环中的值的行为,直到您到达最后一行的赋值为止,因为作为实现细节,taco
的存储将是相同的通过循环每次迭代放置在堆栈上。同样,taco
实际上并未保留此值。如果您尝试编写此代码:
for (int i = 0; i < 10; i++) {
int taco;
Console.WriteLine(taco);
var randy = new Random();
taco = randy.Next();
}
编译器会对你大喊你正在使用未分配的本地。这基本上表明你实际上不能使用之前的值;也就是说,您只是看到了一个关于局部变量如何存储在堆栈中以及调试器如何工作的工件;内存位置仍然保存该值,但您根本无法在代码中使用它。因此,内存位置会保留该值,但 taco
不会,因为它引用taco
使用的存储位置无效,直到它为止明确初始化。
答案 1 :(得分:0)
那是因为int taco
实际上并没有创建一个名为'taco'的int。
当编译器必须编译代码时,它必须分配所需的所有内存。
例如,当您使用C / C ++编写代码时,在声明变量的那一刻,其值不会设置为任何值,因此它将保存先前存储的任何值(这可能导致令人讨厌的错误)。
在C#中,编译器不允许您访问变量,除非事先定义它们。
答案 2 :(得分:-1)
在下一次迭代的上下文中,taco
未初始化,可以是任何内容。