ホームページ > バックエンド開発 > C++ > キャプチャされた変数を備えたC#ループが予期しない結果を生成するのはなぜですか?

キャプチャされた変数を備えたC#ループが予期しない結果を生成するのはなぜですか?

Mary-Kate Olsen
リリース: 2025-02-03 08:20:10
オリジナル
211 人が閲覧しました

Why Do C# Loops with Captured Variables Produce Unexpected Results?

- 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)
{
    Console.WriteLine(act.Invoke());
}</code>
ログイン後にコピー

この制限を克服し、各操作が独自のキャプチャ変数を持つようにするために、C#は簡単なソリューションを提供します。 variable サイクル内のvariableのコピーを作成することにより、各操作は独自の唯一の例をキャプチャし、ラムダ式の外側の変更がキャプチャ値に影響しないようにします。

その他の一般的な状況

この問題は、サイクル内の変数を含む他のシナリオにも表示される場合があります。

これら2つのケースでは、現在のサイクルイテレーションをキャプチャするために変数のローカルコピーが必要です。
<code class="language-csharp">while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}</code>
ログイン後にコピー

結論variablevariable

C#サイクルで変数をキャプチャする動作を理解することは、事故を避けるために不可欠です。この記事で説明したソリューションは、各操作に独自の独立したキャプチャ変数があることを保証し、それにより予測可能で予想される行動を実現します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート