Differenza tra cast esplicito e uso del comando ‘as’

Per effettuare una conversione da un tipo A ad un tipo B, si può pensare di eseguire un cast esplicito:

 A a = new A();
 B b = (B)a;

oppure si può utilizzare il comando ‘as’:

 A a = new A();
 B b = (a as B);

Tuttavia le due tipologie di conversione sono differenti per comportamento, per valore di ritorno e anche per istruzioni del compilatore utilizzate.

Andiamo a vedere queste differenze:

  1. innanzitutto il cast esplicito ritorna una exception in caso di errori nella conversione, mentre nello stesso caso il comando ‘as’ ritorna semplicemente un valore null
  2. anche in virtù del punto 1, in caso di utilizzo del comando ‘as’ è necessario che il tipo B del nostro esempio sia sempre un reference type o almeno un nullable type (come ad esempio int?), mentre nel caso del cast esplicito questo non è necessario
  3. con il cast esplicito è possibile utilizzare conversioni definite dall’utente nella class (user-defined conversions, per esempio nel caso di due classi senza nessuna relazione tra loro), mentre con il comando ‘as’ questo non è consentito
  4. infine, scendendo al livello dell’Intermediate Language (IL), le istruzioni utilizzate (OpCode) sono diverse, infatti mentre un cast esplicito viene tradotto in IL con l’istruzione ‘castclass’, per il comando ‘as’ si fa ricorso all’istruzione ‘isinst’

Sebbene in alcuni casi l’uso del comando ‘as’ possa risultare leggermente più veloce rispetto al cast esplicito, la scelta dell’uno o dell’altro sistema dipende molto dallo scenario in cui è necessario effettuare la conversione.

Differenza tra cast esplicito e uso del comando ‘as’

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...