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

なぜタコが価値を保持しているのか、私は混乱しています。基本的に、最初の反復で「int taco」にブレークポイントを設定すると、taco が 0 であることを確認できます。窓。なぜそうなのか誰か教えてもらえますか?

4

3 に答える 3

5

の宣言 (および初期化) の後の次の行にブレークポイントを置きますtaco

なぜtaco値を保持するのか混乱しています。

値を保持していません。デバッガーのメカニズムが、ループの次の反復で宣言と初期化をまだ見ていないことを確認しているだけです。占有しているのと同じメモリ位置を見ていますが、コードで使用できないため、概念的にはその値を保持していません。tacotaco

現在、コードでは、 text で述べている初期化が実際に欠落していることに注意してください。コードを記述どおりに続行すると、最後の行の割り当てに到達するまで、デバッガーは前のループからの値を表示する動作を示しますtaco。ループを繰り返します。繰り返しtacoますが、実際にはこの値を保持していません。このコードを書こうとすると:

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

コンパイラは、割り当てられていないローカルを使用していると怒鳴ります。これは基本的に、以前の値を実際に使用できないことを示しています。つまり、ローカル変数がスタックにどのように格納されているか、およびデバッガーがどのように機能するかという成果物を見ているだけです。そのメモリの場所はまだその値を保持していますが、実際にはコードでまったく使用できません。そのため、メモリの場所は値を保持しますが、明示的に初期化されるまでtacoは によって使用される格納場所を参照することは有効ではないため、値は保持されません。taco

于 2013-06-13T20:29:04.033 に答える
0

これint tacoは、「taco」という名前の int を実際に作成しないためです。

コンパイラがコードをコンパイルする必要がある場合、必要なすべてのメモリを割り当てる必要があります。

たとえば、C/C++ でコードを記述する場合、変数を宣言した瞬間、その値は何も設定されないため、以前に格納された値が保持されます (厄介なバグにつながる可能性があります)。

C# では、変数が事前に定義されていない限り、コンパイラは変数にアクセスできません。

于 2013-06-13T20:31:00.803 に答える
-1

次の繰り返しのコンテキストでは、tacoは初期化されておらず、何でもかまいません。

于 2013-06-13T20:28:27.067 に答える