ホームページ > バックエンド開発 > C++ > C#foreachループ変数の再利用により、「修正閉鎖へのアクセス」の問題が発生するのはなぜですか?

C#foreachループ変数の再利用により、「修正閉鎖へのアクセス」の問題が発生するのはなぜですか?

Linda Hamilton
リリース: 2025-01-31 21:16:10
オリジナル
585 人が閲覧しました

Why Does C# Foreach Loop Variable Reuse Cause

c#foreachループ変数の再利用:問題と解決策

c#lambda式と匿名の方法では、foreachループ内の「修正閉鎖」問題を導入します。 この例を考えてみましょう:

<code class="language-csharp">foreach (var s in strings)
{
   query = query.Where(i => i.Prop == s); // Modified closure issue
   ...
}</code>
ログイン後にコピー

コンパイラの生成されたコードは、問題のルートを明らかにしています:

<code class="language-csharp">string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}</code>
ログイン後にコピー

s変数は外側ループと宣言されています。このデザインは、最初は無害に見えますが、問題を作成します。パフォーマンスの利点は提供されず、ループの外側の変動使用量を制限します。

なぜこのデザイン?

この変数の再利用は、初期のC#(1.0)の設計選択でした。 内側変数と外変数の違いは取るに足らないとみなされました。ただし、C#2.0の閉鎖セマンティクスはこれを変更しました。

ループとの一貫性を維持すると、ループ変数は外側に配置されました。 C#5以降の変更の変更for

欠陥を認識して、C#5は破壊的な変化を導入しました。ループ変数は、ループの本体の内側に論理的にになりました。 各反復は新鮮なコピーを取得します。

これにより、「変更された閉鎖」の問題が解決し、古い方法が安全ではありません。 また、特にforeachループのラムダや匿名のメソッドを使用した場合、のキーワード使用の重要性を強調しています。

以上がC#foreachループ変数の再利用により、「修正閉鎖へのアクセス」の問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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