私はthis questionでC#5.0にはloop variable closureが導入されていますが、それが意味するものを見つけるために質問のリンクにアクセスしました。私には恥ずかしがりますが、私はループ変数クロージャーの多くを理解することができませんでした。なぜなら、前回のコンパイル警告が生成されなかったセクションブロックからの警告を生成するために、新しいバージョンのプログラミング言語でコードが変更される私が理解しているので、ループクロージャはforeachのフォーマットではなく、配列に含まれる変数です。これは正しいですか?ループ変数クロージャとは何ですか?
-2
A
答えて
3
はシンプルforeach
ループください: C#5の前に
foreach(var i in Enumerable.Range(0,10))
{
Console.WriteLine(i);
}
を、ループ全体の実行(反復ごと)を使用しただけで変数i
がありました。
C#5の導入後、このループには10個の個別の変数...ループの繰り返しごとに異なるものが追加されます。これらの変数の寿命はより短く、すべて同じ名前ですが、それでも一意の変数です。
一見したところで差はあまり見えないかもしれませんが、クロージャを使って作業しているときに、古い動作に予期しない結果が生じる可能性があります。
あなたは、このコードサンプルで違いを見ることができます:
var results = new List<Func<int>>();
foreach(var i in Enumerable.Range(0,10))
{
results.Add(() => i);
}
foreach(var item in results)
{
Console.WriteLine(item());
}
このコードはコンパイルおよびVS 2010とVS 2012の両方から実行(およびそれ以降)、しかし、あなたが使用するかによって異なる結果が得られますでしょう。
closure
コンパイラが変数を通常のスコープ領域から「クローズオーバー」または「ホイスト」してそのライフタイムを延長すると、何が起こりますか?ラムダ式(=>
演算子で示されています)で作業しているときはいつも、クロージャも関わっていることがよくあります。私のサンプルでは、変数i
は、リストに配置された匿名関数が利用できるようにクロージャーで使用されています。
変数と値の違いを理解することが重要です。 VS2010でコードを実行できるのは、変数が1つだけだった場合、その区別は非常に明確です...ループの以前の反復からの変数の値は、関数の前のループの後の反復によって変更され続ける可能性がありますが呼び出されます。誰もが尋ねる前に
は:パフォーマンス上の違いはありません。違いは、コンパイラの抽象度の詳細です。はパフォーマンスには影響しますが、測定可能な方法では影響しません。
関連する問題
- 1. ループ内のローカル変数のクロージャとキャプチャ
- 2. ループ内のクロージャとローカル変数
- 3. forループ内のクロージャ - パラメータとしてループ変数を持つコールバック
- 4. KCacheGrindのクロージャとは何ですか?
- 5. 匿名クロージャとは何ですか?なぜクロージャは通常クロージャと異なるのですか?
- 6. 正確にクロージャは何ですか?
- 7. コンストラクタ関数クロージャ変数
- 8. クロージャとネストクロージャの違いは何ですか?
- 9. Swiftのクロージャとコールバックの違いは何ですか?
- 10. JavaScriptのクロージャと変数の参照
- 11. forループとforeachループ(クロージャ付き)で異なる動作
- 12. JavaScript:クロージャ変数の使用
- 13. groovyクロージャのインスタンス化変数
- 14. 変数を変数に設定するとクロージャが実行されますか?
- 15. vimの@@変数とは何ですか?
- 16. 「フリー変数」とは何ですか?
- 17. フラグ変数とは何ですか?
- 18. ソフト変数とは何ですか?
- 19. 自由変数とは何ですか?
- 20. モデル(変数)とは何ですか?
- 21. ループ内の閉じた関数内の変数に影響を与えるクロージャ
- 22. JavaScriptのグローバル変数とウィンドウ変数は何ですか?
- 23. Volatile変数とAtomic変数の違いは何ですか?
- 24. definePlugin変数とenv変数の違いは何ですか?
- 25. 両方のクロージャで2回呼び出されるクロージャ内の変数の値は同じですか?
- 26. 関数のクロージャにアクセスすることは可能ですか?
- 27. C#代理人、動的プロキシ、クロージャ、関数ポインタの違いは何ですか?
- 28. Javascript。クロージャと動的な 'this'バインディングとの違いは何ですか?
- 29. クロージャ内の変数定義をオーバーライドできますか?
- 30. CF10でクロージャの変数をスコープする方法は?
ここは閉鎖に関する良い記事です。http://www.codethinked.com/c-closures-explained –