c#foreach
ループ:閉鎖の問題につながるデザインの欠陥
c# 'sforeach
ループ内でlambda式または匿名メソッドを使用すると、「修正閉鎖へのアクセス」エラーを作成できます。 コンパイラのループ変数の処理は、この問題の重要な要素です。
可変スコープの問題
ほとんどの言語とは異なり、c#はループ変数foreach
ループの本体を宣言します。これは、ループ全体に1つの変数インスタンスのみが存在することを意味します。 各反復は、この単一の変数を更新し、閉鎖内で使用すると予期しない動作につながります。 閉鎖は、各反復からの値ではなく、変数の最終値をキャプチャします。
ループ変数の制限
もう1つの制限は、ループの範囲外でループ変数にアクセスできないことです。これは、ループ変数が他の言語で通常動作する方法と矛盾しており、ループが完了した後に変数の値が必要な場合、開発者に回避策を使用させます。
なぜこのデザイン?foreach
最初のC#仕様は、ループ変数の範囲についてあいまいでした。 C#2.0で閉鎖サポートが追加されたとき、ループの外側に変数を配置する決定(ループと同様)が作成されました。 しかし、これは問題のあることが証明されており、予想される行動と矛盾し、エラーを引き起こします。
C#5の解決策foreachループ変数は各反復内でfor
以上がなぜC# 's `foreach`ループ変数の再利用が閉鎖の落とし穴につながるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。