2011-06-19 6 views
10

Duplicar posible:
casting vs using the 'as' keyword in the CLRC# diferentes formas de fundición - (T) vs obj obj como T

he visto dos maneras diferentes de fundición en C#.

Por ejemplo:

MyObj foo = (MyObj) bar; // this is what I see most of the times 
MyObj foo = bar as MyObj; // I do see this sometimes 
  • Así que, ¿cuál es la diferencia básica?
  • ¿Cuáles son los nombres propios de la fundición style 1 y style 2?
  • ¿Cómo decido cuándo usar qué?
  • ¿Hay algún problema importante de rendimiento?
  • ¿Hay algo más que deba saber relacionado con este tema?

Gracias mucho por mirar en esto :)

Respuesta

24

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 nullen 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.

+1

No mencionaste los operadores de conversión de tipo, que no implican la conversión, pero utilizan la misma sintaxis que la conversión. –

+1

@Merlyn: Ok, agregaré eso, gracias. :) @pst: ¡Gracias por la limpieza! – Mehrdad

+1

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