2010-03-27 6 views
7

J'apprends C# .Peut Je veux dire que la fermeture a construct that can adopt the changes in the environment in which it is defined.C# -Fermeture -Clarification

Exemple:

List<Person> gurus = 
new List<Person>() 
       { 
        new Person{id=1,Name="Jon Skeet"}, 
        new Person{id=2,Name="Marc Gravell"}, 
        new Person{id=3,Name="Lasse"} 
       };    


void FindPersonByID(int id) 
{ 
    gurus.FindAll(delegate(Person x) { return x.id == id; }); 
} 

La id variable est déclarée dans le champ d'application de FindPersonByID() mais t on peut encore accéder la variable locale id dans la fonction anonyme (ie) delegate(Person x) { return x.id == id; }

(1) est ma compréhension de fermeture est correcte?

(2) Quels sont les avantages des fermetures?

Répondre

5

Oui le code à l'intérieur de FindPersonByID tire profit d'une fermeture en utilisant le paramètre id dans l'expression lambda. Strictement parlant, les définitions des fermetures sont un peu plus complexes mais, à la base, c'est correct. Si vous voulez plus d'informations sur la façon dont ils fonctionnent, je vous encourage à lire les articles suivants

Le principal avantage de la fermeture est essentiellement ce que vous avez démontré ci-dessus. Il vous permet d'écrire le code d'une manière plus naturelle et directe sans avoir à vous soucier des détails d'implémentation de la génération de l'expression lambda (généralement)

Considérons par exemple combien de code vous devrez écrire dans le abscence des fermetures

class Helper { 
    private int _id; 
    public Helper(int id) { 
    _id = id; 
    } 
    public bool Filter(Person p) { 
    return p.id == _id; 
    } 
} 

void FindPersonsByID(int id) { 
    Helper helper = new Helper(id); 
    gurus.FindAll(helper.Filter); 
} 

Tout cela juste pour exprimer l'idée d'utiliser un paramètre à l'intérieur d'un délégué.

+0

Bonne explication Mr jaredpar – user274364