La tua comprensione è vera. Mi sembra di provare a micro-ottimizzare per me. Dovresti usare un cast normale quando sei sicuro del tipo. Oltre a generare un'eccezione più sensata, fallisce anche velocemente. Se ti sbagli su tua ipotesi sul tipo, il vostro programma fallirà immediatamente e sarete in grado di vedere la causa del fallimento subito piuttosto che aspettare una NullReferenceException
o ArgumentNullException
o anche un qualche errore logico in futuro. In generale, as
un'espressione che non è seguita da un null
segno di spunta da qualche parte è un odore di codice.
D'altra parte, se non sei sicuro del cast e ti aspetti che fallisca, dovresti usare as
invece di un cast normale avvolto in un try-catch
blocco. Inoltre, as
si consiglia l' uso di un controllo del tipo seguito da un cast. Invece di:
if (x is SomeType)
((SomeType)x).SomeMethod();
che genera isinst
un'istruzione per la is
parola chiave e castclass
un'istruzione per il cast (eseguendo effettivamente il cast due volte), è necessario utilizzare:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Questo genera solo isinst
un'istruzione. Il primo metodo presenta un potenziale difetto nelle applicazioni multithread poiché una condizione di competizione potrebbe causare il cambio di tipo della variabile dopo che il is
controllo ha avuto esito positivo e si è verificato un errore nella linea di lancio. Quest'ultimo metodo non è soggetto a questo errore.
La seguente soluzione non è consigliata per l'uso nel codice di produzione. Se odi davvero un costrutto così fondamentale in C #, potresti prendere in considerazione il passaggio a VB o qualche altra lingua.
Nel caso in cui uno odia disperatamente la sintassi del cast, può scrivere un metodo di estensione per imitare il cast:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
e usa una sintassi [?] pulita:
obj.To<SomeType>().SomeMethod()