Warum Invoke-Methode der konstruierten Delegate-Klasse ist virtuell?

8

Ich habe in CLR über C # gesehen und im codeproject-Artikel Delegate Behind the Scenes , wenn der C # -Compiler dies sieht

%Vor%

es erzeugt tatsächlich so etwas

%Vor%

Die Frage ist, warum Invoke-Methode ist virtuell ? Kann dieser generierte Delegattyp geerbt werden? Aus der Sicht der CLR sieht es aus wie es geht. Aber warum? Warum erstellen Sie keine versiegelte Klasse, so dass es zur Laufzeit keine Nachschlagefunktion für virtuelle Methoden gibt?

    
alpha-mouse 28.09.2011, 19:19
quelle

2 Antworten

1

Dies ist eine Art Quacksalberei. Eine ähnliche Art der Typisierung, die System.Int32, einen von ValueType abgeleiteten Wertetyp, zu einem Referenztyp macht. Macht keinen Sinn, ist in C # illegal, verhält sich aber tatsächlich so. Die eigentliche Implementierung der Invoke-Methode eines Delegierten ist in der CLR verborgen und eine statische Funktion, die in C ++ geschrieben ist.

Aber es ist sicherlich sinnvoll, es als virtuell zu kommentieren, weil es sich wie eine virtuelle Methode verhält. Der tatsächliche Code, der ausgeführt wird, ist nicht wie bei einer nicht virtuellen Klassenmethode festgelegt. Noch schwieriger zu verstehen ist, was das richtige Modell für einen Delegaten sein sollte, der an eine statische Methode gebunden ist. Eine virtuelle Methode, die statisch ist?

Es ist nur eine virtuelle Ente.

Das Auflesen von Funktionszeigern, wie sie in C verwendet werden, könnte Ihnen helfen, ein besseres mentales Modell für Delegierte zu erhalten. Ein Delegat ist ein Funktionszeiger mit Glocken, er kann auch das Zielobjekt speichern. C # fehlt die Syntax, um dies anders auszudrücken.

    
Hans Passant 28.09.2011, 20:00
quelle
1

Hier ist ein interessantes Zitat von Eric Lippert zur Vererbung in .NET:

>
  

Ich werde gelegentlich gefragt "aber wie kann ein Wert eingeben, wie int, was ist   32 Bits Speicher, nicht mehr und nicht weniger, möglicherweise vom Objekt erben? Ein   das im Speicher angeordnete Objekt ist viel größer als 32 Bits; Es hat eine Synchronisierung   Block und eine virtuelle Funktionstabelle und alle möglichen Sachen drin. "   Anscheinend denken viele Leute, dass Vererbung etwas zu tun hat   mit wie ein Wert im Speicher angelegt wird. Aber wie ist ein Wert angelegt?   Speicher ist ein Implementierungsdetail, keine vertragliche Verpflichtung von   die Vererbungsbeziehung!

Es gibt eine Reihe von "speziellen" geerbten Typen in .NET: System.ValueType , System.Enum , System.Void und System.Delegate , unter anderem bin ich mir sicher.

Wenn ich mir die Interna von System.Delegate mit Reflector.NET ansehe, sehe ich eine Reihe von Anrufen wie folgt:

%Vor%

Ich vermute, dass es sich um ein anderes Implementierungsdetail handelt, bei dem die Delegierten nicht dieselben virtuellen Lookup-Tabellen verwenden müssen, die virtual methods verwenden müssen.

    
Enigmativity 29.09.2011 00:57
quelle