sábado, 1 de agosto de 2009

Casting con los operadores "is" y "as" en C#

Estoy leyendo el libro CLR Via C# y quería compartir con vosotros algo que he visto y resulta interesante en cuanto a rendimiento en el código ;-)

El operador "is" comprueba si un objeto es compatible con un tipo dado, y el resultado de la operación es un valor booleano (true o false). El operador "is" nunca provoca una excepción.
Ejemplo:
Object o = new Object();
Boolean prueba = (o is Object); //prueba es true
Boolean prueba2 = (o is Persona); //prueba2 es false

Si la referencia al objeto es null, el operador "is" siempre devuelve el valor false, porque no hay un objeto disponible para verificar su tipo.
El modo más común de usar el operador is:
if (o is Persona)
{
Persona p = (Persona) o;
//...
}

El CLR según nuestra condición IF del ejemplo verificará el tipo de objeto 2 veces, primero comprobará si o es compatible con el tipo Persona. Si lo es, dentro del if, el CLR otra vez comprobará que o referencia a una Persona cuando haga el cast.
El CLR nos proporciona seguridad, pero a costa de rendimiento, ya que el CLR determina el tipo actual del objeto referenciado por la variable o, y luego el CLR recorre la jerarquía de herencia comprobando cada tipo base contra el tipo especificado (Persona).

Aquí es dónde C# viene en nuestro rescate y nos ofrece el operador "as" para simplificarnos la vida y ganar en rendimiento:
Persona p = o as Persona;
if (p!=null)
{
//...
}

En este código el CLR comprueba si o es compatible con el tipo Persona, si lo es, "as" devuelve una referencia no nula al mismo objeto. Por contra si no es compatible, devuelve un valor null. La buena noticia, es que el operador "as" provoca que el CLR sólo tenga que comprobar el tipo de objeto una única vez.
El operador "as" tampoco genera ninguna excepción, si el objeto no puede convertirse, simplemente devuelve un valor null.

Eso es todo, voy a seguir escuchando MOS (Ministry of Sound, no penséis en Sharepoint frikis!!!) Trance Nation que ya es sábado sabadete ...

2 comentarios:

Juan Antonio Barcelo Aravid dijo...

Impresionante. Magnifico este post y los anteriores.

Saludos compañero, nos vemos el 15.

Francisco Ruiz dijo...

Gracias. No se yo si al final será el día 15, porque Berni tiene compromisos y no puede ir.