Los secretos del casting

Y no estamos hablando de los castings de Operación Triunfo o Gran Hermano, no. Os propongo pasar la tarde de hoy pensando en una de esas cosas que no dejan de ser interesantes pese a servir para bastante poco 😉

Seguro que todos los días mientras programáis os encontráis con situaciones en las que tenéis que convertir objetos de un tipo a otro, lo que se conoce como un casting (que no tiene nada que ver con concursos, por suerte). En C# las dos formas más comunes de realizarlo son con un cast explicito o utilizando el operador as:

object o = new Concursante();
Concursante concursante;

concursante = (Concursante)o; //Explicito
concursante = o as Concursante; //Operador as

Visto esto ya no haré ningún comentario, y me limitare a lanzar mi pregunta. Basaros simplemente en lo que sabéis de ambas operaciones y en vuestra intuición vale? La pregunta es…cual de las dos formas de realizar un cast es más rápida?

La respuesta, en breve, en esta misma cadena…o no 😉


Rock Tip. Visto que todo lo que hemos tenido por el momento en estos rock tips ha sido música en inglés creo que por una vez, aprovechando el cambio de temática del post, podríamos buscar otro idioma…como el alemán. Hoy cierra el post Rammstein con una de sus mejores canciones (IMHO) acompañada de un gran videoclip: Ich Will. Enjoy!!

9 comentarios sobre “Los secretos del casting”

  1. Buuuuf!!! Ich Will… BRUTAL canción!!!

    Sobre lo que comentas, supongo que el explícito es más rápido: el operador «as» devuelve null si los tipos no son compatibles, mientras que el explícito simplemente lanza una excepción. Yo entiendo que el operador «as» debe intentar una conversión explícita dentro de un try…

    Saludos!!! 🙂

  2. Es bien sabido que «as» es bastante más rápido, pero es mejor no usar mucho ninguna de las dos formas porque ambas son bastante lentas.

  3. Opino que «as» también es más rápido que casting explicito:

    Si tiramos IL, para el explicito utiliza castclass y para «as» isinst, lo que quiere decir que antes de convertir y lanzar una InvalidCastException, chequea que el tipo de la instancia es el correcto y sino devuelve null.

    Salu2

  4. Si mal no recuerdo en el 1er caso se utiliza una sentencia castclass() y si utilizamos «as» se utiliza isinst(), debería decompilarlo a MSIL para ver si era asi.

    En el primer caso siempre trata de hacer un cast, y si no se puede se lanza una excepcion del tipo IvalidCastException, en cambio en el 2do caso solo se valida por el tipo de objeto, pero no se hace cast ni se lanza ninguna excepcion.

    Creo que era algo asi 😀

    Saludos

    PD: lo mio es Team System, esto de las conversiones era mucho más simple en VB !!! jeje

  5. as solo puede ser utilizado con tipos por referencia, si la conversión no resulta se devuelve una excepción, mientras que el cast devuelve un objeto nulo, as es mas rápido porque asume el tipo del control.

  6. Ya lo había visto. A este seguramente le sale una diferencia tan grande por que su código debe de lanzar bastantes excepciones, y eso en .Net es muy muy lento.

    Si no hay excepciones ni código de control las diferencias son mínimas a favor de «as».

    Si controlas los posibles errores, un «if» es bastante más rápido que un «try catch», así que el «as» vuelve a ganar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *