Quali sono le caratteristiche e le prestazioni di 'è' la riflessione in C#?[duplica]
-
09-06-2019 - |
Domanda
A questa domanda ha già una risposta qui:
- C# 'è' operatore di prestazioni 8 risposte
È indicato che '" casting è molto più veloce rispetto prefisso casting, ma che cosa 'è' la riflessione?Quanto è grave?Come si può immaginare, la ricerca è " su Google non è terribilmente efficace.
Soluzione
Ci sono un paio di opzioni:
- Il classic cast:
Foo foo = (Foo)bar
- Il
as
operatore di cast:Foo foo = bar as Foo
- Il
is
prova:bool is = bar is Foo
- Il classic cast la necessità di verificare se
bar
può essere tranquillamente il castFoo
(quick), e poi in realtà non è (più lento), o lanciare un'eccezione (molto lento). - Il
as
operatore la necessità di verificare sebar
può essere gettato, quindi eseguire il cast, o se esso non può essere tranquillamente cast, poi appena tornanull
. - Il
is
operatore controlla sebar
è possibile eseguire il cast di Pippo, e restituire unboolean
.
Il is
il test è rapido, perché non solo la prima parte di una operazione di fusione.Il as
l'operatore è più veloce di un classico cast perché non genera un'eccezione se il cast non riesce (il che lo rende utile per le situazioni in cui è legittimamente aspettarsi che il cast potrebbe fallire).
Se avete solo bisogno di sapere se la variabile bar
è un Foo
quindi utilizzare il is
operatore MA, se si sta andando per verificare se bar
è un Foo
, e se è così, poi il cast, allora si dovrebbe utilizzare l' as
operatore.
Essenzialmente ogni cast deve fare l'equivalente di un is
controllare internamente per cominciare, al fine di garantire che il cast è valido.Quindi, se si fa un is
controllare seguita da un cast (un as
il cast, o con il classico operatore di cast) si sta effettivamente facendo il is
controllare due volte, che è un leggero overhead aggiuntivo.
Altri suggerimenti
Il modo in cui ho imparato è che questo:
if (obj is Foo) {
Foo f = (Foo)obj;
f.doSomething();
}
è più lento rispetto a questo:
Foo f = obj as Foo;
if (f != null) {
f.doSomething();
}
È abbastanza lenta per la materia?Probabilmente no, ma è una cosa semplice da prestare attenzione che si potrebbe anche farlo.
"è" è fondamentalmente l'equivalente del "isinst" IL gestore-che tale articolo viene descritto come veloce.
Dovrebbe essere abbastanza veloce non importa.Se si sta controllando il tipo di un oggetto abbastanza per avere un impatto notevole sulle prestazioni è necessario ripensare il vostro disegno