Ho un programma che richiede prestazioni veloci. All'interno di uno dei suoi loop interni, ho bisogno di testare il tipo di un oggetto per vedere se eredita da una determinata interfaccia.C# 'è' prestazione dell'operatore
Un modo per farlo sarebbe con la funzionalità di controllo del tipo integrata del CLR. Il metodo più elegante c'è probabilmente il 'è' parola chiave:
if (obj is ISpecialType)
Un altro approccio sarebbe quello di dare alla classe di base la mia propria funzione GetType virtuale(), che restituisce un valore enum predefinito (nel mio caso, in realtà , ho solo bisogno di un bool). Quel metodo sarebbe veloce, ma meno elegante.
Ho sentito che esiste un'istruzione IL specifica per la parola chiave 'is', ma ciò non significa che venga eseguita rapidamente quando viene tradotta in assembly nativo. Qualcuno può condividere alcune informazioni sulle prestazioni di "è" rispetto all'altro metodo?
AGGIORNAMENTO: Grazie per tutte le risposte informate! Sembra che un paio di punti utili siano distribuiti tra le risposte: il punto di Andrew su "è" che esegue automaticamente un cast è essenziale, ma anche i dati sulle prestazioni raccolti da Binary Worrier e Ian sono estremamente utili. Sarebbe bello se una delle risposte fosse modificata per includere tutte di queste informazioni.
btw, CLR non vi darà la possibilità di creare la propria funzione Tipo GetType(), perché rompe una delle regole CLR principali - veramente tipi – abatishchev
Ehm, non sono completamente sicuro di cosa intendi con la regola dei "veri tipi", ma capisco che il CLR ha una funzione Type GetType() incorporata. Se dovessi usare quel metodo, sarebbe con una funzione di un nome diverso che restituisce qualche enum, quindi non ci sarebbe alcun conflitto di nome/simbolo. – JubJub
Penso che abatishchev significhi "tipo sicurezza". GetType() non è virtuale per impedire a un tipo di mentire su se stesso e quindi preservare la sicurezza del tipo. –