2010-03-27 8 views
7

Sto imparando C# .Can intendo chiusura come a construct that can adopt the changes in the environment in which it is defined.C# -Chiusura -Clarification

Esempio:

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 variabile id è dichiarata nel campo di applicazione del FindPersonByID(), ma t siamo ancora in grado di accedere la variabile locale nella funzione anonima (ad esempio) delegate(Person x) { return x.id == id; }

(1) La mia comprensione della chiusura è corretta?

(2) Quali sono i vantaggi che possiamo ottenere dalle chiusure?

risposta

5

Sì, il codice all'interno di FindPersonByID sta sfruttando una chiusura utilizzando il parametro id all'interno dell'espressione lambda. A rigor di termini, le definizioni di chiusure sono un po 'più complesse, ma a livello di base questo è corretto. Se volete maggiori informazioni su come funzionano vi incoraggio a leggere i seguenti articoli

Il vantaggio principale di chiusure è essenzialmente ciò che si dimostrato sopra. Ti consente di scrivere il codice in modo più naturale e diretto senza doversi preoccupare dei dettagli dell'implementazione di come viene generata l'espressione lambda (generalmente)

Considerare ad esempio la quantità di codice che si dovrebbe scrivere nel assenza di chiusure

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); 
} 

Tutto questo solo per esprimere il concetto di utilizzare un parametro all'interno di un delegato.

+0

Grande spiegazione Mr jaredpar – user274364