Lokale Variablen, die mit den Delegierten
Diese ist eindeutig nicht erscheint, wie es wäre nicht die beste Praxis. Kann mir jemand erklären, warum wäre es nicht ein best-practice-oder wie das funktioniert? Keine Bücher oder Artikel, die eine Erklärung wäre willkommen.
//The constructor
public Page_Index() {
//create a local value
string currentValue = "This is the FIRST value";
//use the local variable in a delegate that fires later
this.Load += delegate(object sender, EventArgs e) {
Response.Write(currentValue);
};
//change it again
currentValue = "This is the MODIFIED value";
}
Den Wert, der ausgegeben wird, ist der zweite Wert "Modifiziert". Was ein Teil der compiler-Magie ist macht diese Arbeit? Ist dies so einfach wie die Verfolgung der Wert auf dem heap und abrufen zu einem späteren Zeitpunkt wieder?
[Edit]: Da einige der Kommentare, die änderung des ursprünglichen Satzes einige...
- Es ist nichts falsch mit, dass die Praxis. Es ist nur mehr fortgeschrittene als Anfänger verstehen würde.
- Abgeordnete; in der Tat, es kann für sehr saubere und elegante design - aber Sie müssen verstehen, die Auswirkungen.
- Das ist wirklich sehr interessant. Ich hätte nicht gedacht, dass messing mit lokalen Variablen, die im Rahmen der Delegierte zugewiesen wurde, wäre eine gute Praxis, aber Sie lernen etwas neues die ganze Zeit.
- Es hängt vom Szenario ab; in den meisten Fällen wäre es eine viel bessere Idee, um eine zweite variable, der Gültigkeitsbereich fest und ändert sich nie - aber es gibt ein paar Anwendungsfälle für aktualisierte Variablen erfasst, Aber in der Tat: behandeln Sie Sie als nur Lesen, bis es einen guten Grund, und Sie haben deutlich weniger Schmerzen.
- Das ist der Unterschied zwischen einem Delegierten und einem Verschluss. Was Sie hier gemacht haben, ist ein Verschluss. Sie sind äußerst mächtig, und die Tatsache, dass wir Verschlüsse in .NET ist ein großes plus, nicht ein minus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
currentValue ist nicht mehr eine lokale variable: es ist ein erfasst variable. Dies stellt so etwas wie:
Jon Skeet ist eine wirklich gute schreiben, bis dieser in C# in Depth, und eine separate (nicht so ausführliche) Diskussion hier.
Beachten Sie, dass die variable currentValue ist nun auf dem heap, nicht den stack - dies hat viele Auswirkungen, nicht zuletzt, dass es kann nun dazu verwendet werden, die von verschiedenen Anrufern.
Dies ist unterschiedlich zu java: in java ist der Wert einer variable erfasst. In C#, die variable selbst erfasst.
Das ist der Punkt; es ist wirklich nicht eine lokale variable nicht mehr - zumindest nicht in Bezug auf, wie wir normalerweise denken, von Ihnen (auf dem stack etc.). Es sieht aus wie einer, ist es aber nicht.
Und für die info, wieder "keine gute Praxis" - anonyme Methoden und die erfassten Variablen sind eigentlich ein unglaublich mächtiges Werkzeug besonders bei der Arbeit mit events. Fühlen Sie sich frei, Sie zu benutzen, aber wenn Sie unten gehen diesen Weg, ich würde empfehlen, Kommissionierung bis Jon ' s Buch, um sicherzustellen, dass Sie verstehen, was eigentlich passiert ist.
Müssen Sie erfassen den Wert der variable in der closure/delegieren, sonst kann es geändert werden, wie du gesehen hast.
Zuweisen, currentValue, um eine lokale variable (innen) zu den Delegierten.