El operador “?.”, también llamado safe navigation operator, era la característica más demandada para el lenguaje C# en Uservoice, uno de los principales canales utilizado por Microsoft para obtener feedback e ideas a aplicar en nuevas versiones de sus productos, y parece que definitivamente se está considerando la posibilidad de incluir este útil azucarillo sintáctico tanto en C# como en VB.
Para los que no lo conozcáis, se trata de una construcción que permite acceder a propiedades de objetos sin temor a las null reference exceptions lanzadas cuando estos objetos son nulos.
Mejor veámoslo sobre un ejemplo. Imaginemos la siguiente clase, a la que damos uso un poco más abajo:
public class PersonObviamente, si la variable
{
public Person Father { get; set; }
public string Name { get; set; }
[...]
}
string name = me.Father.Father.Name;
Console.WriteLine("My grandpa’s name is: "+ name);
me
contiene un nulo nuestra aplicación se detendría lanzándonos una cruel excepción. Y lo mismo ocurriría si el nulo lo encontramos en me.Father
o en me.Father.Father
, ¿verdad?Por esta razón, lo habitual es proteger nuestras aplicaciones contra estos casos introduciendo comprobaciones en cada uno de los puntos para impedir la catástrofe y ofrecer un resultado razonable cuando aparezcan dichos valores nulos:
string name = me != null && me.Father != null && me.Father.Father!= nullLa característica que en palabras de Mads Torgersen (PM de C# en Microsoft) está siendo “seriamente considerada”, consistiría en añadir a los lenguajes C# y VB.NET un nuevo operador de navegación segura “?.” (interrogación punto) que se utilizaría en lugar del punto para navegar por grafos de objetos y, a diferencia de éste, retornaría null al encontrarse con un valor nulo durante la navegación.
? me.Father.Father.Name
: null;
Console.WriteLine("My grandpa’s name is: " + (name ?? "I don’t know"));
Así, el código anterior podría escribirse de una forma bastante más limpia y legible:
var name = me?.Father?.Father?.Name;En este caso da igual si el nulo está en
Console.WriteLine("My grandpa’s name is " + ( name ?? "I don’t know"));
me
, en me.Father
o en me.Father.Father
: en todos ellos la expresión completa retornaría null. Pero aún hay más: la inclusión de este operador no sólo se aplicaría a la navegación por propiedades, sino a otras construcciones del lenguaje como la invocación a métodos, evitando la excepción si el objeto sobre el que se actúa es nulo:
var myFamily = me?.GetFamily();O también el acceso a valores mediante un índice:
var myMary = me?.Children?["mary"];En definitiva, se trata de una característica muy interesante para simplificar nuestro código y hacerlo más legible. Según Torgersen, se va a prototipar durante los próximos meses, por lo que sería posible encontrarlo ya en la próxima versión de C#.
Fuentes:
- At last, C# is getting “?.”, sometimes called the Safe Navigation Operator
- Uservoice suggestion: Add "?." operator to C#