Qual è la differenza tra RuntimeTypeHandle e Type?
-
09-06-2019 - |
Domanda
E perché dovrei usarne uno sopra l'altro nel mio codice?
Soluzione
Attenzione:Questa risposta sembra non essere aggiornata. È stato pubblicato prima che diventasse disponibile .NET 4, che apparentemente ha introdotto alcune ottimizzazioni in merito
Type
e quindi ha reso obsolete le informazioni contenute in questa risposta.Vedere questa risposta più recente per dettagli.
Secondo questo post sul blog (del 2006) di Vance Morrison, RuntimeTypeHandle
è un tipo di valore (struct
) che avvolge un puntatore non gestito, quindi Type.GetTypeHandle(obj).Equals(anotherHandle)
è più veloce da utilizzare per confronti rigorosi "è esattamente dello stesso tipo" rispetto a obj.GetType().Equals(anotherType)
- quest'ultimo crea System.Type
istanze apparentemente più pesanti.
Tuttavia, è anche meno ovvio e rientra sicuramente nella categoria "micro-ottimizzazione", quindi se ti stai chiedendo quando è necessario l'uno rispetto all'altro, probabilmente dovresti semplicemente utilizzare System.Type.
Altri suggerimenti
In .NET 4.0 Beta 1 RuntimeTypeHandle
semplicemente avvolge RuntimeType
.Sembra che tutti i vantaggi derivanti dall'usarlo a buon mercato Type
i delegati sono andati.
Prova dell'affermazione di cui sopra:
- Quello di Microsoft Fonte di riferimento per il
System.RuntimeTypeHandle
tipo mostra che questo tipo è in effetti solo un involucroSystem.RuntimeType
in questi giorni. - Articolo del blog di Sandro Magi del 2013 "CLR:Il costo dei test di tipo dinamico" contiene un benchmark e una nota finale che mostra i presunti vantaggi prestazionali di
RuntimeTypeHandle
sono scomparsi in .NET 4.