El operador doble interrogación en C#

Los tipos anulables en .NET 2.0 son una interesante característica a la que se le puede sacar bastante partido, como ya expliqué en su momento.


Quiero comentar ahora una cosa que se me pasó entonces: el operador doble interrogante (??), el cual es además muy poco conocido.


Dado que los tipos anulables pueden contener un valor o un nulo debemos realizar continuamente comprobaciones en el código para ver si tenemos nulos o no, algo así (ej.):



int? num1 = 5; //En la realidad lo obtendríamos de una BD o algo así
int num2;
if (num1 == null)
   num2 = 0;
else
   num2 = num1;


Lo cual es sencillo pero es un rollo de escribir si hay que hacerlo continuamente. Claro que podemos reducir el código usando el operador ? de toda la vida de C#:



int? num1 = 5;
int num2 = (num1==null)?0:num1;


Es idéntico, más reducido, pero tampoco es mejore mucho la legibilidad ¿verdad?


Bien, C# nos ofrece el operador ?? que hace exactamente lo mismo que lo anterior y tiene las virtudes de ser conciso y a la vez legible (si sabes qué siginifica la doble interrogación, claro). Lo anterior quedaría con este operador así:



int? num1 = null;
int num2 = num1??0;


Es fácil de leer si lo interpretas así: asignar a num2 el valor de num1 o un cero si es nulo. Muy útil. Espero que lo disfrutes si no lo conocías :-))

Sin categoría

14 thoughts on “El operador doble interrogación en C#

  1. Me refería en general los tipos anulables, lo de que es un lenguaje de juguete… bueno… yo prefiero C#, pero uso ambos :), era simple curiosidad.

    Saludos

  2. Buena e interesante opción que utilizaré. En cuanto a lo de VB, creo que depende de como programa cada uno, hay gente que le gustar tirar más líneas con ; y {} y otras que no. Creo la escalabilidad(que no se si es la palabra adecuada, pero no me sale otra) ya nos la da el framework.

    Un Saludo

  3. Hasta donde yo sé, el operador ?? es exclusivo de C# 2005, en VB 2005 tenemos que utilizar la propiedad HasValue. Que tiene guasa que se pueda asignar ‘Nothing’ a una variable pero NO se pueda «preguntar» si vale ‘Nothing’… con lo fácil que podría ser implementar sintácticamente un «if x = Nothing». Esa clase de cosas son las que me hacen pensar aún lo del «lenguaje de juguete». Que de todas maneras no veas si ha evolucionado desde la versión 6 y anteriores.

    Claro que también se podría decir que para qué queremos más y más operadores en un lenguaje hasta ahora «casi perfecto» como C#, operadores como éste ‘??’ que pueden recordarnos un poco a C++ en lo críptico que se volvía el lenguaje con tanto operador.

    Pero en fin creo que por aquí nos salimos del tema… 😉

    Saludos

  4. Visual Basic ha evolucionado mucho, aunque hay que tener en cuenta que C# es un lenguaje muy poderoso y de caracteristicas que lo hacen mas robusto ante los demas.

  5. Para los que sin conocer se dedican a criticar. El operador ternario de vb es iif que seria el equivalente para ?, no se si para ?? exista uno similar pero un acercamiento podria ser lo siguiente

    Dim s1 As String = Nothing
    Dim s2 As String = IIf(s1 Is Nothing, «(undefined)», s1).ToString

    No me encuentro a favor de vb, pero si recordaran a fin de cuentas es msil, y se que el aferrarse a un solo lenguaje es un antipatron

    El arma mas poderosa es simplemente con la que se cuenta con mayor conocimiento de la misma

  6. oye yo tengo un problema al leer la cadena

    TJ,96,978,D3,uEllQaTqV3KfeUuO¿cGsJktRQLroS-¿1k1OsDh5vrKlNdz09

    me desaparece el signo ¿ puede ser poralgo similar a lo que estas comentando?

  7. Muchas gracias, acabo de aprender dos cosas nuevas.

    Pero he encontrado esto de casualidad, estaba buscando el operador |= (de C#)
    Alguien sabe que hace ese operador?

  8. Me imagino que te refieres al operador != que significa «Distinto» o «Desigualdad»

    Por ejemplo:
    if (a != b)

    quiere decir «si a es distinto de b» 🙂

    Saludos

    JM

Deja un comentario

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