2010-12-07 10 views
3

私はC#で閉鎖してビットを果たし、さらには、しかし、何が本当にこの問題でなければならないことを私に叫んだんた生産仕様のアプリでそれらを書かれた、またはのみをすることができましたクロージャを使用して解決しました。シナリオ

クロージャが特に解決に役立つ問題はありますか?また、C#4.0にクロージャを持つ問題はありますか?

おかげ

答えて

6

クロージャは、コンパイラの機能ではなく、プラットフォームの機能であることを考えると、が彼らと一緒に行うことができないものはありません。

コンパイラが手作業で使用するすべてのコードを書くことができます(ただし、式ツリーについてはいくつかの例外がありますが、コンパイラはその言語で公開されていないいくつかのIL命令にアクセスできます)。

しかし、ではなく、では、囲み変数にアクセスする必要があるLINQでクロージャを使用することができます。たとえば、次のように

public List<Person> FilterByAge(IEnumerable<Person> people, int age) 
{ 
    return people.Where(p => p.Age >= age).ToList(); 
} 

ラムダ式は、デリゲートの中からageにアクセスし、閉鎖されていること。

落とし穴について:

+1

いかなるパフォーマンス上の利点を?また、LINQでクロージャーを使用しないのはなぜ嫌なのですか? LINQの囲み変数には、そのコードサンプルの要件にアクセスするための他の実際の方法はありません。 – dotnetdev

+2

@dotnetdev:代わりに、コンパイラと同じようにたくさんの余分なクラスを作成することができます。さようなら、読みやすさ。もちろん、同じコードなので、パフォーマンスは同じです。 –

+0

ありがとうございます。ありがとう。私は閉鎖が明らかな選択肢であると思う。 – dotnetdev