ホームページ >バックエンド開発 >C++ >C# 's `foreach`ループ変数再利用が閉鎖に問題を引き起こすのはなぜですか?

C# 's `foreach`ループ変数再利用が閉鎖に問題を引き起こすのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-31 21:11:11518ブラウズ

Why Does C#'s `foreach` Loop Variable Reuse Cause Problems with Closures?

c#

サイクル変数の再利用:不必要なtrap foreach c#でlambda式または匿名メソッドを使用する場合、修正された閉鎖アクセスが表示される場合があります。

サイクル内の変数の再利用は、この問題を悪化させました。

foreachコンパイラは通常、修正された閉鎖例に示すように、サイクル本体の外側のサイクル変数を宣言します。

これは、サイクル内の宣言された変数の期待とは異なります:

<code class="language-C#">string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}</code>

外部変数ステートメントは、変数の範囲が長くなるため、修正された閉鎖アクセスの問題を悪化させました。サイクルで宣言された変数は、サイクル外でアクセスできません。

<code class="language-C#">while (enumerator.MoveNext())
{
   string s;
   s = enumerator.Current;
   ...
}</code>
コンパイラは、ラムダの発現と匿名の方法を導入する前に、円形変数を再利用することにしました。したがって、その時点で変数の再利用が完全に考慮されていたという潜在的なトラップはありませんでした。

foreach C#5では、この設計上の欠陥は大きな変化によって解決されます。円形変数は、各閉鎖が新しいコピーを取得するように、サイクル本体の内側に論理的にあります。この変更により、変更されたサイクルの閉鎖トラップが排除されます。

この修理は一般的な改善ですが、古いバージョンの古いバージョンを使用している場合、またはこの修理をサポートしていない場合でも、この問題に注意を払う必要があります。

以上がC# 's `foreach`ループ変数再利用が閉鎖に問題を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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