ホームページ >バックエンド開発 >C++ >C#ループが間違った変数値をキャプチャするのはなぜですか?

C#ループが間違った変数値をキャプチャするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-02-03 07:59:09874ブラウズ

Why Does My C# Loop Capture the Wrong Variable Value?

サイクル内のカバー変数:奇妙な問題 C#サイクルを使用する場合、変数をキャプチャするために特別な問題に遭遇する可能性があります。次のシーンを考えてみましょう: 予想とは対照的に、このコードは、予想されるシーケンス0、2、4、6、8の代わりに5つの「10」を印刷します。

質問:サイクルのキャプチャ変数
<code class="language-csharp">List<Action> actions = new List<Action>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => Console.WriteLine(variable * 2));
    ++variable;
}

foreach (var act in actions)
{
    act.Invoke();
}</code>

サイクルで作成されたすべてのラムダ関数は、同じ変数

をキャプチャします。したがって、これらの関数が外部と呼ばれる場合、それらはすべての最終値を引用します。

解決策:救助をコピー

variable この問題を解決するには、サイクル内の変数のコピーを作成してから、各ラムダ関数でキャプチャする必要があります。 variable

コピーを作成することにより、サイクルで作成された各クロージャーは、独自の

一意の値をキャプチャし、それにより予想される出力を生成します。 予防策

このテクノロジーは、複数の反復の単一変数を参照するforおよびforeachサイクルにも適用できます。この問題を回避するには、foreachサイクルのC#5コンパイラの処理方法に従うことをお勧めします。これにより、各反復に独自のキャプチャ変数が保証されます。
<code class="language-csharp">while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}</code>

以上がC#ループが間違った変数値をキャプチャするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。