Was ist die Magie, die Eigenschaften mit der CLR arbeiten lässt?

8

Ich bemerkte, dass Aufrufe an Eigenschaftenaccessoren manchmal wie Methoden aussehen, wenn ich in eine Assembly denke.

%Vor%

Nun war ich neugierig, und ich habe eine Methode mit einer ähnlichen Signatur in Class1 eingefügt, die wie die Standardkonvention für Accessoren aussieht.

%Vor%

Irgendwie behandelt der C # -Compiler immer noch get_Boolean als Methode.

Was ist die magische Soße, um eine Methode zu erhalten, um eine Eigenschaft zu sein?

    
Daniel A. White 26.10.2012, 13:10
quelle

2 Antworten

7

Wenn du dir die IL anschaust, wirst du so etwas finden:

%Vor%

Also ist die 'Magie' ein .property -Mitglied, das zwei Methoden miteinander klebt.

    
dtb 26.10.2012, 13:16
quelle
7

Eine .NET-Assembly enthält nicht nur Code, sondern auch Metadaten , die den Code beschreiben.

Bei einer Methode werden Metadaten ausgegeben, die den Namen, die Signatur usw. der Methode beschreiben.

Im Falle einer Eigenschaft X wird sie als eine Reihe von Accessor-Methoden kompiliert ( get_X und / oder set_X ), und für jede dieser Methoden werden die üblichen Methodenmetadaten ausgegeben. Dann werden zusätzliche Metadaten ausgegeben, die angeben, dass alle diese Zugriffsmethoden zusammen als eine logische Einheit (die Eigenschaft) zusammengehören.

Nun zurück zu Ihrem Beispiel: Wenn Sie eine Methode namens get_Boolean mit C # definieren, gibt der C # -Compiler nur die Methodenmetadaten, aber keine zusätzlichen Eigenschaftenmetadaten aus. Im Wesentlichen muss der Compiler auswählen, welche Metadaten ausgegeben werden sollen. Und da Sie nicht die C # -Syntax für eine Eigenschaft, sondern für die Methodendeklarationssyntax verwendet haben, generiert der C # -Compiler Metadaten für.

Metadaten sind im ECMA 335-Standard , die die CLI (.NET-Plattform) beschreibt. Eine Erläuterung der Funktionsweise von Metadaten für Eigenschaften finden Sie in Kapitel II.22.34 auf Seite 241 .

    
stakx 26.10.2012 13:15
quelle

Tags und Links