Detaillierte Erläuterung der Variablenerfassung in C#-Abschlüssen
Einführung
Variablenerfassung ist ein grundlegender Aspekt in C#-Abschlüssen, der es einem Abschluss ermöglicht, auf Variablen zuzugreifen, die in seinem umschließenden Bereich definiert sind. Dieser Artikel befasst sich eingehend mit der Variablenerfassung und beantwortet spezifische Fragen zur Funktionsweise, zur Erfassung von Werttypen im Vergleich zu Referenztypen und zum Boxen.
Wie lokale Variablen erfasst werden
Variablenerfassung erfolgt, wenn ein Lambda-Ausdruck oder eine anonyme Methode auf eine lokale Variable in ihrem umschließenden Bereich zugreift. Der genaue Erfassungsmechanismus ist jedoch nicht klar.
Um dies zu verstehen, betrachten wir ein einfaches Beispiel:
<code class="language-csharp">Action action = () => { Console.WriteLine(counter); }; int counter = 5;</code>
In diesem Beispiel erfasst der Lambda-Ausdruck die Variable counter
in ihrem umschließenden Bereich. Um dies zu erreichen, erstellt der Compiler tatsächlich eine anonyme Klasse, eine sogenannte Abschlussklasse, die einen Verweis auf die erfasste Variable speichert. Wenn der Lambda-Ausdruck ausgeführt wird, greift er über die Abschlussklasse auf die erfasste Variable zu:
<code class="language-csharp">class ClosureClass { private int counter; public ClosureClass(int counter) { this.counter = counter; } public void Execute() { Console.WriteLine(counter); } }</code>
In diesem Fall speichert die Abschlussklasse einen Verweis auf die Variable counter
und stellt eine Methode für den Zugriff darauf bereit.
Werttypen und Referenztypen
Der Typ der erfassten Variablen bestimmt, wie sie in der Abschlussklasse gespeichert wird:
Verpacken
Bei der Erfassung von Werttypen ist kein Boxing erforderlich. Der erfasste Wert wird direkt in der Abschlussklasse gespeichert und die ursprüngliche Variable kann geändert werden, ohne dass sich dies auf den erfassten Wert auswirkt.
Das obige ist der detaillierte Inhalt vonWie funktioniert die Variablenerfassung in C#-Abschlüssen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!