¿Cuál es la diferencia entre transmitir y usar "como" en C#?

Resuelto Xaisoft asked hace 15 años • 8 respuestas

Si hay una diferencia, ¿cuál es la diferencia entre las dos formas de hacer el siguiente reparto?

En este caso ees un GridViewRowEventArgsobjeto.

GridView gv = (GridView)e.Row.FindControl("gv"); //first way

GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Xaisoft avatar Apr 01 '09 00:04 Xaisoft
Aceptado

Las diferencias son:

  • Si un lanzamiento falla, arroja un calibre InvalidCastException.
  • Si el asoperador falla, simplemente devuelve una referencia nula.
  • No se puede utilizar ascon 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. ( asse 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...

Jon Skeet avatar Mar 31 '2009 17:03 Jon Skeet

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 asdará como resultado un error NullReferenceExceptionsi la conversión falla.

El uso de una conversión dará como resultado un error InvalidCastExceptionsi 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 nullverificación antes de usar la variable). De lo contrario, utiliza un yeso, haciendo así más explícitas tus intenciones.

jonp avatar Mar 31 '2009 18:03 jonp

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.

Daniel Brückner avatar Mar 31 '2009 17:03 Daniel Brückner