ホームページ >バックエンド開発 >C++ >ループのC#Lambda式が同じ変数をキャプチャするのはなぜですか?これを解決するにはどうすればよいですか?

ループのC#Lambda式が同じ変数をキャプチャするのはなぜですか?これを解決するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-02-03 07:46:13294ブラウズ

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?

ループとその解でのC#lambdaの発現キャプチャ

を理解する ループ内のLambda式は、一般的な落とし穴を示します。それらは同じ変数をキャプチャし、予期しない結果につながります。 これは、ラムダの式が、その作成時に変数の

をキャプチャしないのではなく、変数自体への参照をキャプチャしないために発生します。 この例を考えてみましょう:

予想出力(0、2、4、6、8)の代わりに、コードは5 8秒出力します。これは、すべてのlambda式が、各ラムダが作成された時点での値ではなく、
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

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

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

値(ループが完了した後10)の値を参照するためです。 ソリューション:コピーの作成variable

これを解決するには、各反復内にループ変数のコピーを作成します。

さて、各ラムダ式は異なる変数をキャプチャし、正しい出力をもたらします。

c#5以降:foreach and catvs

<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    int copy = variable; // Create a copy
    actions.Add(() => copy * 2);
    ++variable;
}</code>
C#5以降のバージョンでは、この問題に対処するために

ループの動作が変更されました。 コンパイラは、「閉鎖割り当ての一時変数」(CATV)を使用して、各反復に対して個別の変数を自動的に作成し、手動コピーの必要性を排除します。 この簡素化により、コードがよりクリーンになり、読みやすくなります。 ただし、copyループの例では、明示的なコピーが必要です。

以上がループのC#Lambda式が同じ変数をキャプチャするのはなぜですか?これを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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