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 NullReferenceExceptiono ArgumentNullExceptiono anche un qualche errore logico in futuro. In generale, asun'espressione che non è seguita da un nullsegno 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 asinvece di un cast normale avvolto in un try-catchblocco. Inoltre, assi consiglia l' uso di un controllo del tipo seguito da un cast. Invece di:
if (x is SomeType)
((SomeType)x).SomeMethod();
che genera isinstun'istruzione per la isparola chiave e castclassun'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 isinstun'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 iscontrollo 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()