Lambda-Ausdrücke: Compiler-Verhalten

9

Nun gehe ich durch das Thema 'Lambda-Ausdrücke' (Kapitel 17; Delegaten, C # Syntaktischer Zucker für Delegierte). Jeffery gibt an, dass der C # -Compiler eine neue nicht statische Klasse im Hintergrund erstellt, die Folgendes enthält:

  1. Felder zum Speichern aller lokalen Variablen, auf die im Lambda-Ausdruck zugegriffen wurde.
  2. Eine Methode, deren Rumpf den Lambda-Ausdruck enthält und deren Signatur / Rückgabetyp mit dem Delegaten übereinstimmt, für den Lambda Expressin verwendet wurde.

Ich habe die folgenden zwei Fragen:

  1. Ich habe mich ein wenig selbst getestet und gesehen, dass wenn der Lambda-Ausdruck den Wert einer lokalen Variable ändert (definiert in einer Methode, in der das Lambda-Expresison verwendet wird), der neue Wert auch außerhalb des Ausdruckskörpers reflektiert wird . Wie ist das möglich, wenn man bedenkt, dass der Ausdruck tatsächlich in einer anderen Klasse ist?

  2. Warum muss die emittierte Klasse nicht-statisch sein, wenn das Gleiche von der Static-Klasse perfekt ausgeführt werden kann?

Ich hoffe, das ist kein sehr einfaches Konzept, das ich nicht verstehen kann.

Lassen Sie mich wissen, wenn ich weitere Einzelheiten angeben muss.

    
astraldust 14.03.2013, 09:10
quelle

1 Antwort

5

Zuallererst hatte ich vor ein paar Tagen eine ähnliche Frage.

Closure captured variable ändert auch das Original

Zweitens, was ist der Zweck, es zu einer statischen Klasse zu machen? Es wird immer nur ein Objekt erstellt, und dieses Objekt muss nicht über die gesamte Anwendungslebensdauer hinweg existieren.

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

Die Sache ist, dass dasselbe Objekt sowohl mit der anonymen Methode als auch mit der lokalen Variablen außerhalb der anonymen Methode referenziert wird, also ist es egal, von wo Sie es ändern, Sie ändern das Gleiche.

>

Auch die Antwort von Tim Goodman in der Frage, auf die ich verlinkte, zeigt Ihnen, was zu tun ist, um zu vermeiden, dass Änderungen überall reflektiert werden, indem Sie ein neues Objekt innerhalb Ihrer Anonymus-Methode erstellen.

    
Freeman 14.03.2013, 09:14
quelle

Tags und Links