¿Cuál es la diferencia entre transmitir y usar "como" en C#?
Si hay una diferencia, ¿cuál es la diferencia entre las dos formas de hacer el siguiente reparto?
En este caso e
es un GridViewRowEventArgs
objeto.
GridView gv = (GridView)e.Row.FindControl("gv"); //first way
GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Las diferencias son:
- Si un lanzamiento falla, arroja un calibre
InvalidCastException
. - Si el
as
operador falla, simplemente devuelve una referencia nula. - No se puede utilizar
as
con tipos de valores que no admiten valores NULL (por ejemplo, no se puede utilizar "o as int
"). - El operador de reparto también se utiliza para unboxing. (
as
se puede utilizar para desempaquetar a un tipo de valor que acepta valores NULL). - El operador de transmisión también puede realizar conversiones definidas por el usuario.
EDITAR: He escrito en otra parte sobre cuándo creo que es apropiado usar qué operador. Quizás valga la pena leerlo...
Lo que no se menciona en las respuestas anteriores es la intención : ¿por qué realiza la conversión y (más importante aún) qué sucede en las líneas después de la conversión?
Por ejemplo, he visto un código similar al siguiente varias veces:
if ((foo as SomeType).SomeMethod()) { /* ... */ }
Esto podría compararse con la versión que utiliza Cast:
if (((SomeType) foo).SomeMethod()) { /* ... */ }
Entonces, ¿cuál de estos es mejor?
El elenco lo es.
El uso as
dará como resultado un error NullReferenceException
si la conversión falla.
El uso de una conversión dará como resultado un error InvalidCastException
si la conversión falla.
Ahora dime, ¿cuál es una excepción más útil para depurar? ¿Un NullReferenceException
, que podría ser producido por casi cualquier cosa, o un InvalidCastException
, que le permite saber qué salió mal realmente?
Por lo tanto, utilícelo soloas
si la conversión es realmente opcional (lo que significa que debe haber una null
verificación antes de usar la variable). De lo contrario, utiliza un yeso, haciendo así más explícitas tus intenciones.
El reparto seguro como
variable as type
hace lo mismo que
(variable is type) ? (type)variable : (type)null
y no funcionará para tipos de valor.