Quali sono le caratteristiche e le prestazioni di 'è' la riflessione in C#?[duplica]

StackOverflow https://stackoverflow.com/questions/57701

  •  09-06-2019
  •  | 
  •  

Domanda

A questa domanda ha già una risposta qui:

È 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.

È stato utile?

Soluzione

Ci sono un paio di opzioni:

  1. Il classic cast: Foo foo = (Foo)bar
  2. Il as operatore di cast: Foo foo = bar as Foo
  3. Il is prova: bool is = bar is Foo

  1. Il classic cast la necessità di verificare se bar può essere tranquillamente il cast Foo (quick), e poi in realtà non è (più lento), o lanciare un'eccezione (molto lento).
  2. Il as operatore la necessità di verificare se bar può essere gettato, quindi eseguire il cast, o se esso non può essere tranquillamente cast, poi appena torna null.
  3. Il is operatore controlla se bar è possibile eseguire il cast di Pippo, e restituire un boolean.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top