Was ist der Unterschied zwischen dem direkten Aufruf eines Delegates mit DynamicInvoke und der Verwendung von DynamicInvokeImpl?
Den docs für beide DynamicInvoke und DynamicInvokeImpl sagen:
Dynamisch aufgerufen (late-bound)
Methode vertreten, die von der aktuellen
delegieren.
Merke ich, dass DynamicInvoke und DynamicInvokeImpl nehmen Sie ein array von Objekten, anstatt eine bestimmte Liste von Argumenten (die die spät gebundene Teil ich vermute). Aber ist das der einzige Unterschied? Und was ist der Unterschied zwischen DynamicInvoke und DynamicInvokeImpl.
InformationsquelleAutor der Frage Jason Baker | 2009-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den wichtigsten Unterschied zwischen dem Aufruf direkt (die kurzer hand für
Invoke(...)
) und mitDynamicInvoke
ist Leistung, eine um mehr als den Faktor *700 von meiner Maßnahme (unten).Mit der direkt - /
Invoke
Ansatz, die Argumente sind bereits validiert, die über die Signatur der Methode, und der code bereits vorhanden ist, gehen diese in der Methode direkt (ich würde sagen, "IL", aber ich scheine zu erinnern, dass die Laufzeitumgebung stellt diese direkt ohne anderen IL). MitDynamicInvoke
es braucht, um zu überprüfen, Sie aus dem array per reflection (d.h. sind Sie alle für dieses Gespräch; Sie brauchen, unboxing, etc.); dies ist langsam (wenn Sie es in einer engen Schleife) und sollte vermieden werden, wo möglich.Beispiel; die Ergebnisse der ersten (ich erhöhte die
LOOP
zählen von der vorherigen Bearbeiten, zu geben, einen vernünftigen Vergleich):Mit code:
InformationsquelleAutor der Antwort Marc Gravell
Zufällig habe ich gefunden, ein weiterer Unterschied.
Wenn
Invoke
wirft eine exception kann abgefangen werden, indem die erwartete exception-Typ.Allerdings
DynamicInvoke
wirft einenTargetInvokationException
. Hier eine kleine demo:Während der zweite test wird grün, die ersten Gesichter ein TargetInvokationException.
InformationsquelleAutor der Antwort Rainer Hilmer
Eigentlich gibt es keinen funktionalen Unterschied zwischen den beiden. wenn Sie die pull-up-die Umsetzung in den Reflektor, werden Sie feststellen, dass DynamicInvoke nur Anrufe DynamicInvokeImpl mit den gleichen Argumenten. Keine zusätzliche Validierung abgeschlossen ist, und es ist eine nicht-virtuelle Methode, so gibt es keine chance, sein Verhalten zu ändern, indem eine abgeleitete Klasse. DynamicInvokeImpl ist eine virtuelle Methode, wo alle die eigentliche Arbeit ist getan.
InformationsquelleAutor der Antwort JaredPar