2010-12-07 31 views
3

J'ai joué avec des fermetures un peu en C# et même les écrit dans les applications production spec, ou peut , cependant, rien n'a vraiment crié à moi que ce problème doit seulement être , résolu avec l'utilisation d'une fermeture.scénarios quand utiliser les fermetures

Y a-t-il un problème lorsque les fermetures sont particulièrement utiles pour la résolution? Aussi, y a-t-il des getcha avec des fermetures en C# 4.0?

Merci

Répondre

6

Étant donné que les fermetures sont une caractéristique du compilateur plutôt qu'une fonction de plate-forme, il n'y a rien qui ne peut pas être fait avec eux.

Vous pouvez écrire tout le code que le compilateur utilise à la main (enfin, à quelques exceptions près pour les arborescences d'expression, et le compilateur a accès à certaines instructions IL qui ne sont pas exposées par le langage).

Cependant, vous seriez fou pas pour utiliser des fermetures dans LINQ où vous avez besoin d'accéder aux variables englobantes. Par exemple:

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

Cette expression lambda est une fermeture, l'accès age à partir d'un délégué.

En ce qui concerne gotchas:

+1

Les avantages de performance de la fermeture ? Aussi, pourquoi serais-je fou de ne pas utiliser les fermetures dans LINQ? Bien que, je suppose qu'il n'y a aucun autre moyen réel d'accéder à une variable englobante dans LINQ avec l'exigence de cet exemple de code. – dotnetdev

+2

@dotnetdev: L'alternative est de créer un tas de classes supplémentaires comme le fait le compilateur. Bye bye, lisibilité. La performance serait la même, bien sûr, parce que c'est le même code. –

+0

Vous avez. Merci. Je suppose que, les fermetures sont l'option évidente. – dotnetdev