Una de las características poco conocidas, pero muy interesante de C# es el operador ‘??’. Nos da una forma simple y legible para chequear si un valor es null, y ponerle un valor alternativo.
Ejemplos simples de uso.
Varias personas han blogeado sobre este operador – aquí, aquí, aquí y aquí tenéis algunos ejemplos sobre su uso. Con tan sólo poner ?? chequeamos si el valor de la variable de la izquierda es nula, y si lo es, le indicamos un valor por defecto en la parte derecha de la expresion. Si el valor de la izquierda no es nulo, entonces lo devuelve.
Por ejemplo, supongamos que tenemos la variable string “message”. Podemos ver si el mensaje era nulo, y dale un valor alternativo en caso afirmativo:
Como el valor de “message” no es nulo, en “result” tendremos el mensaje “hello world”
En el siguiente código, “message” es nulo, y el operador ?? le asignará el valor alternativo:
El operador ?? funciona tanto con tipos por referencia como con tipos por valor. Por ejemplo, ahora chequeamos si el entero nullable “number” es nula. Como no lo es, el resultado es 55:
Si “number” es null, entonces devuelve el valor 0:
Usando el operador ?? con LINQ
El mes pasado escribí un post sobre el uso del nuevo LINQ to XML en .NET 3.5. Una de las cosas que tenemos que hacer muchas veces es comprobar cuando faltan o son errones algunos elementos o atributos en XML. El operador ?? puede ser muy útil en estos casos.
Por ejemplo, tenemos un archivo XML o un feed con los siguientes datos de contacto:
Podemos escribir el siguiente código en C# con LINQ to XML para abrir el archivo y obtener toda la secuencia de objetos de tipos anónimos con las propiedades “Name”, “Title”, “Email” y “YearsAtCompany”, y enlazar los resultados a un control <asp:gridview> en una página:
Fijaos que estamos usando el operador de conversión explícita de la clase XElement para obtener valores fuertemente tipados del XML. Esto nos permite hacer el cast del valor de c.Element(“YearsAtCompany”) a un entero – y convertirá automáticamente el valor de un string a un entero, y tipar la propiedad “YearsAtCompany” de nuestro tipo anónimo como un entero.
Cuando ejecutamos el codigo anterior, obtendremos una lista en un GridView con nuestros contactos:
Esta conversión explícita funciona cuando el elemento <YearsAtCompany> esté siempre definido. Pero se lanzará una excepción cuando tengamos un <Contact> sin el subelemento <YearsAtCompany>:
Una forma de arreglar esto es modificar la consulta LINQ to XML para indicar que YearsAtCompany es un entero nullable. Esto lo hacemos cambiando el casting explícito para que sea int? en lugar de int:
Esto permite que nuestra consulta se ejecute limpiamente y no lanze ningún error. Entonces, cuando el elemento <YearsAtCompany> no exista, le asignará un valor nulo.
Cuando ejecutamos la aplicación y enlazamos los resultados al GridView, podemos ver que la columna YearsAtCompany está vacio:
¿Pero qué pasa si no queremos que nos devuelva un entero nullable, sino que nos devuelva un 0?
Bueno … aquí es donde entra el nuevo operador ??. Modificamos la consulta LINQ to XML de la siguiente manera, y le decimos que si el elemento no existe, devuelva un 0:
De esta forma decimos que si el elemento <YearsAtCompany> del XML no existe devolvemos un 0. Fijaos que el intelissense de C# nos lo detecta automáticamente y la propiedad YearsAtCompanydel tipo anónimo nunca será nula – y marca la propiedad como ‘int’ y no como ‘int?’.
Si ahora ejecutamos la página veremos el valor 0 en lugar de una celda vacía:
Resumen
Podemos usar el operado ?? de C# en multitud de escenarios. Afortunadamente el escenario descrito anteriormente nos da un ejemplo más que suficiente sobre cómo usarlo en un escenario con LINQ (incluso en LINQ to SQL, LINQ to XML, LINQ to Objects, LINQ to SharePoint, etc).
Espero que sirva:
Scott.
Traducido por: Juan María Laó Ramos. Microsoft Student Partner.
Artículo original en:
muy bueno tu post muchisimas gracias de verdad me sirvio de mucho!! 🙂
LikeLike