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