Tu comprensión es verdadera. Eso suena como tratar de micro-optimizar para mí. Debe usar un yeso normal cuando esté seguro del tipo. Además de generar una excepción más sensata, también falla rápidamente. Si se equivoca sobre su hipótesis sobre el tipo, el programa fallará inmediatamente y usted será capaz de ver la causa del fracaso de inmediato en lugar de esperar a que una NullReferenceException
o ArgumentNullException
ni siquiera un error lógico en algún momento en el futuro. En general, una as
expresión que no es seguida por un null
cheque en alguna parte es un olor a código.
Por otro lado, si no está seguro sobre el yeso y espera que falle, debe usarlo en as
lugar de un yeso normal envuelto con un try-catch
bloque. Además, as
se recomienda el uso de una verificación de tipo seguida de un yeso. En vez de:
if (x is SomeType)
((SomeType)x).SomeMethod();
que genera una isinst
instrucción para la is
palabra clave y una castclass
instrucción para el reparto (realizar efectivamente el reparto dos veces), debe usar:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Esto solo genera una isinst
instrucción. El primer método tiene una falla potencial en aplicaciones de subprocesos múltiples, ya que una condición de carrera puede hacer que la variable cambie su tipo después de que la is
verificación se haya realizado correctamente y falle en la línea de lanzamiento. El último método no es propenso a este error.
La siguiente solución no se recomienda para su uso en el código de producción. Si realmente odias una construcción tan fundamental en C #, podrías considerar cambiar a VB u otro lenguaje.
En caso de que uno odie desesperadamente la sintaxis del elenco, puede escribir un método de extensión para imitar el elenco:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
y use una sintaxis ordenada [?]:
obj.To<SomeType>().SomeMethod()