Diese ist eindeutig nicht scheint nicht die beste Praxis zu sein. Kann mir jemand erklären, warum das keine bewährte Praxis ist oder wie das funktioniert? Für Bücher oder Artikel, die eine Erklärung liefern, wären wir dankbar.
//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";
}
Der Wert, der ausgegeben wird, ist der zweite Wert "Geändert" . Welcher Teil der Compiler-Magie sorgt dafür, dass dies funktioniert? Ist es so einfach, wie den Wert auf dem Heap zu speichern und ihn später wieder abzurufen?
[Bearbeiten]: In Anbetracht einiger Kommentare sollte der ursprüngliche Satz etwas geändert werden...
0 Stimmen
An dieser Praxis ist nichts auszusetzen. Sie ist nur fortgeschrittener, als es Anfänger verstehen würden.
0 Stimmen
Es kann sogar für ein sehr sauberes/elegantes Design sorgen - aber man muss sich über die Auswirkungen im Klaren sein.
0 Stimmen
Das ist wirklich sehr interessant. Ich würde nicht denken, dass das Herumspielen mit lokalen Variablen innerhalb des Bereichs, der dem Delegaten zugewiesen wurde, eine gute Praxis wäre, aber man lernt immer wieder etwas Neues.
0 Stimmen
Es hängt vom Szenario ab; in den meisten Fällen wäre es eine viel bessere Idee, eine zweite Variable zu erstellen, die eng skaliert ist und sich nie ändert - aber es gibt ein paar Anwendungsfälle für aktualisierte erfasste Variablen, Aber in der Tat: Behandeln Sie sie als schreibgeschützt, bis es einen guten Grund gibt und Sie werden viel weniger Schmerzen haben.
0 Stimmen
Das ist der Unterschied zwischen einem Delegaten und einem Abschluss. Was Sie hier gemacht haben, ist eine Closure. Sie sind extrem leistungsfähig, und die Tatsache, dass wir Closures in .NET haben, ist ein großes Plus, kein Minus.