2010-03-27 7 views
7

Ich lerne C# .Can ich Schließung bedeuten als a construct that can adopt the changes in the environment in which it is defined.C# -Stilllegung -Clarification

Beispiel:

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

Die Variable id wird im Rahmen der FindPersonByID erklärt(), aber t noch wir zugreifen können die lokale Variable id innerhalb der anonymen Funktion (dh) delegate(Person x) { return x.id == id; }

(1) Ist mein Verständnis von Schließung korrekt?

(2) Welche Vorteile haben wir von Verschlüssen?

Antwort

5

Ja, der Code innerhalb von FindPersonByID nutzt eine Schließung, indem er den Parameter id innerhalb des Lambda-Ausdrucks verwendet. Streng genommen sind die Definitionen von Schließungen etwas komplexer, aber auf einer grundlegenden Ebene ist dies korrekt. Wenn Sie weitere Informationen wünschen, wie sie funktionieren, ermutige ich Sie, die folgenden Artikel lesen

Der primäre Vorteil von Verschlüssen ist im Wesentlichen, was Sie oben gezeigt. Es ermöglicht Ihnen, den Code in einer natürlicheren, geradlinigeren Art und Weise zu schreiben, ohne sich um die Details der Implementierung des Lambda - Ausdrucks kümmern zu müssen (allgemein) Abwesenheit von Verschlüssen

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

All dies nur um das Konzept der Verwendung eines Parameters innerhalb eines Delegaten auszudrücken.

+0

Große Erklärung Herr Jaredpar – user274364