Frage

Das ist eindeutig nicht erscheint, wie es keine bewährte Methode wäre. Kann mir jemand erklären, warum es nicht eine bewährte Methode wäre, oder wie das funktioniert? Alle Bücher oder Artikel eine Erklärung bieten würde geschätzt.

//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 Ausgang ist der zweite Wert ist "Modified" . Welcher Teil der Compilers Magie macht diese Arbeit? Ist das so einfach wie Spur des Wertes auf dem Heap zu halten und es später wieder abrufen?

[Bearbeiten]: einige der Kommentare Angesichts der ursprünglichen Satz zu ändern einige ...

War es hilfreich?

Lösung

current ist nicht mehr eine lokale Variable: Es ist ein erfasst Variable. Dies kompiliert, um so etwas wie:

class Foo {
  public string currentValue; // yes, it is a field

  public void SomeMethod(object sender, EventArgs e) {
    Response.Write(currentValue);
  }
}
...
public Page_Index() {
  Foo foo = new Foo();
  foo.currentValue = "This is the FIRST value";
  this.Load += foo.SomeMethod;

  foo.currentValue = "This is the MODIFIED value";
}

Jon Skeet hat eine wirklich gute aufzuschreiben dies in C # in Depth und ein separates ( nicht so detailliert) Diskussion rel="noreferrer">.

Beachten Sie, dass die Variable current ist jetzt auf dem Heap, nicht der Stapel -. Dies viele Auswirkungen hat, nicht zuletzt, dass es nun von verschiedenen Anrufern verwendet werden

Dies unterscheidet sich von Java: in java die Wert einer Variablen erfasst wird. In C #, die Variable selbst erfasst.

Andere Tipps

  

Ich nehme mehr die Frage, die ich gefragt habe ist, dass, wie es mit einer lokalen Variablen arbeiten   [MG edit: "Ack - dies ignoriert ..." wurde später hinzugefügt]

Das ist der Punkt; es wirklich nicht eine lokale Variable nicht mehr - zumindest nicht in Bezug darauf, wie wir sie normalerweise denken (auf dem Stack usw.). Es sieht aus wie ein, aber es ist nicht.

Und für Info, re „nicht empfehlenswert“ - anonyme Methoden und Variablen erfasst sind tatsächlich ein unglaublich mächtiges Werkzeug, insbesondere , wenn sie mit der Ev. Fühlen Sie sich frei, sie zu benutzen, aber wenn Sie diesen Weg gehen nach unten sind, würde ich empfehlen, Jon Buch Kommissionierung bis sicherstellen, dass Sie verstehen, was tatsächlich geschieht.

Sie müssen den Wert der Variablen innerhalb des Verschlusses / Delegierten erfassen, sonst es kann geändert werden, wie Sie gesehen haben.

Zuweisen current auf eine Variable local (innen) zu den Delegierten.

scroll top