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:
Ich habe die folgenden zwei Fragen:
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?
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.
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.