el primero (un "estilo C" fundido "directa" o) lanza una excepción si el molde no es válido. También es la única forma de realizar una conversión de tipo real en el objeto. (Tenga en cuenta que la conversión de tipos es diferente de la fundición, debido a la fundición simplemente cambia el tipo de la variable , mientras que la conversión de tipo le da un tipo diferente * del objeto.)
El segundo (sin nombre en particular, aunque se puede llamarlo "try cast" como se llama en VB.NET) evalúa a null
en su lugar de arrojar un InvalidCastException
. (Debido a este comportamiento, solo funciona para tipos de referencia).
Sin problemas de rendimiento importantes en comparación entre sí.
Usted usa as
solo si espera que su resultado no sea válido. De lo contrario, use el primero.
Por cierto, MSDN might be helpful de partes de su pregunta:
El operador as
es como una operación de fundición. Sin embargo, si la conversión no es posible, devuelve null
en lugar de generar una excepción. Considere la siguiente expresión:
expression as type
Es equivalente a la siguiente expresión, excepto que la expresión se evalúa solo una vez.
expression is type ? (type)expression : (type)null
Tenga en cuenta que el operador as
sólo realiza las conversiones de referencia y las conversiones de boxeo. El operador as
no puede realizar otras conversiones, como las conversiones definidas por el usuario, que en su lugar deberían realizarse mediante el uso de expresiones de conversión.
No mencionaste los operadores de conversión de tipo, que no implican la conversión, pero utilizan la misma sintaxis que la conversión. –
@Merlyn: Ok, agregaré eso, gracias. :) @pst: ¡Gracias por la limpieza! – Mehrdad
Vale la pena señalar que 'foo = bar como SomeType;' es más rápido que hacer 'if (bar es SomeType) {foo = (SomeType) bar; } ', porque el tipo se marca solo una vez. Y es * mucho * más rápido que hacer la barra 'try {foo = (SomeType); } catch (InvalidCastException) {} 'si la conversión falla, porque las excepciones son bastante caras. – Sven