c#lambda expression変数ループでのキャプチャを理解する
C#プログラミングの頻繁な問題には、ループ内のラムダ式が含まれます。 Lambda式が変数をキャプチャする方法は、予期しない結果につながる可能性があります。 この問題とその解決策を調べてみましょう。
このコードを検討してください:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
への参照をキャプチャするために起こります。 ラムダが呼び出される頃には、variable
はすでに10の最終値に達しています。
variable
これを修正するには、各ラムダ式の範囲内でループ変数のコピーを作成する必要があります。
今、各ラムダ式は、作成時にの値の独自の独立したコピーをキャプチャし、予想される出力を生成します。
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { int copy = variable; // Create a copy of the variable actions.Add(() => copy * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
variable
ループで懸念が少ないことに注意することが重要です。コンパイラは、この問題を防ぐために、で変数キャプチャを異なる方法で処理します。 ただし、明示的なコピー方法は、古いC#バージョンとの明確さと互換性のためのベストプラクティスのままです。 このアプローチを使用すると、すべてのC#バージョンとループタイプにわたって一貫した動作が保証されます。
以上がループのC#Lambda式が最終変数値をキャプチャするのはなぜですか?これをどのように修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。