c# For循环在未实例化的变量中保留值

本文关键字:变量 保留 实例化 For 循环 | 更新日期: 2023-09-27 18:18:22

for (int i = 0; i < 10; i++)
{
    int taco;
    var randy = new Random();
    taco = randy.Next();
}

我很困惑为什么taco保留一个值。基本上,如果我在第一次迭代时在"int taco"处设置一个断点,我可以看到taco是0。在第二次迭代中,当我检查它时,taco具有前一次迭代的值,并且我可以在直接窗口中使用它。有人能告诉我为什么会这样吗?

c# For循环在未实例化的变量中保留值

将断点放在taco声明(和初始化)之后的下一个行。

我很困惑为什么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使用的存储位置是无效的。

这是因为int taco实际上并没有创建一个名为'taco'的int。

当编译器必须编译你的代码时,它将不得不分配它所需要的所有内存。

例如,当你用C/c++编写代码时,当你声明一个变量时,它的值没有被设置为任何值,所以它将保存之前存储的任何值(这会导致严重的错误)。

在c#中,编译器不会让你访问变量,除非它们是预先定义的。

在下一次迭代的上下文中,taco是未初始化的,可以是任何值