Operador condicional nulo de C#
{academy-video-youtube({"vid": "eOpmjGF4qxo", "start_time": "0", "title": "Operador Nulo-Condicional en C# (? ¡Operador) Explicado!", "creador": "Gerald Versluis", "longitud": "13m 26s"})}]
En uno de sus vídeos, Gerald Versluis se encontró con una pregunta sobre el signo de interrogación (?) en su código de ejemplo. Esto le llevó a crear un vídeo detallado que explica el operador null-conditional en C#. Si alguna vez te has preguntado qué hace ?. o ?[ ] en C#, el video de Gerald es un gran recurso para entenderlo claramente. Veamos su explicación paso a paso.
Explicación rápida a través de la página Docs
Gerald comienza haciendo referencia a la documentación oficial de Microsoft sobre operadores y expresiones de acceso de miembros. Destaca la sección sobre el operador null-conditional, introducido en C# 6. En el momento de la grabación, C# 9 era la última versión, con C# 10 en el horizonte.
Gerald explica que cuando utilizas a?.x o a?[index], si a es nulo, toda la expresión se evalúa como nula en lugar de lanzar una NullReferenceException. Por lo demás, recupera el valor normalmente.
Aunque la documentación es útil, Gerald prefiere ejemplos prácticos, por lo que pasa a un entorno de codificación interactivo.
Ejemplo a través de try.dot.net
Para demostrarlo, Gerald pasa a try.dot.net, un entorno interactivo de C#. Menciona que esta herramienta se ejecuta en Blazor, lo que permite a los usuarios ejecutar código C# directamente en un navegador.
Muestra brevemente el ejemplo predeterminado de la secuencia de Fibonacci, que está precargado en try.dot.net, y luego lo borra para iniciar un nuevo ejemplo centrado en el operador null-conditional.
Explicación de los operadores de condicional nulo
Gerald crea una clase Persona sencilla con las siguientes propiedades:
public class Person
{
// The Name property of the Person
public string Name { get; set; }
// A reference to another Person object representing the partner
public Person Partner { get; set; }
// An array representing the Person's hobbies
public string[] Hobbies { get; set; }
}
public class Person
{
// The Name property of the Person
public string Name { get; set; }
// A reference to another Person object representing the partner
public Person Partner { get; set; }
// An array representing the Person's hobbies
public string[] Hobbies { get; set; }
}
Él inicializa un objeto Person como nulo:
// Initialize a Person object as null
Person person = null;
// Attempting to access a property of a null object will throw a NullReferenceException
Console.WriteLine(person.Name);
// Initialize a Person object as null
Person person = null;
// Attempting to access a property of a null object will throw a NullReferenceException
Console.WriteLine(person.Name);
Ejecutar este código arroja una NullReferenceException porque person es nulo. Para evitarlo, los desarrolladores suelen añadir una comprobación null antes de acceder a las propiedades:
// Check if the person object is not null before accessing its properties
if (person != null)
{
Console.WriteLine(person.Name);
}
// Check if the person object is not null before accessing its properties
if (person != null)
{
Console.WriteLine(person.Name);
}
Aunque esto funciona, introduce líneas de código adicionales. Gerald explica cómo el operador null-conditional simplifica esta tarea:
// Using the null-conditional operator to safely access the Name property
Console.WriteLine(person?.Name);
// Using the null-conditional operator to safely access the Name property
Console.WriteLine(person?.Name);
Ahora, si person es nulo, la expresión simplemente devuelve nulo en lugar de bloquearse.
Operador no condicional en propiedades
Gerald amplía el ejemplo configurando un objeto Person:
// Create a new Person object
Person person = new Person { Name = "Gerald" };
// Access the Name property safely
Console.WriteLine(person?.Name);
// Create a new Person object
Person person = new Person { Name = "Gerald" };
// Access the Name property safely
Console.WriteLine(person?.Name);
Dado que person no es nulo, imprime correctamente "Gerald".
A continuación, muestra un ejemplo anidado:
// Safely access the Name property of the Partner object
Console.WriteLine(person?.Partner?.Name);
// Safely access the Name property of the Partner object
Console.WriteLine(person?.Partner?.Name);
Si person.Partner es nulo, toda la expresión se evalúa como nula en lugar de lanzar una excepción. De este modo se evitan condicionantes innecesarios.
Encadenamiento de operadores nulo-condicionales
Gerald explica que los operadores de condición nula pueden encadenarse, lo que hace que el código sea más limpio cuando se trata de objetos profundamente anidados. En lugar de escribir varios controles null, puede utilizar:
// Chain null-conditional operators to safely access nested objects
Console.WriteLine(person?.Partner?.Name);
// Chain null-conditional operators to safely access nested objects
Console.WriteLine(person?.Partner?.Name);
Si person o person.Partner son nulos, el resultado será nulo, evitando errores en tiempo de ejecución.
Operadores de condición nula en matrices
Gerald amplía la discusión a arrays y colecciones. Añade una matriz Hobbies a la clase Person y muestra cómo acceder a los elementos de forma segura:
// Safely access the first element of the Hobbies array
Console.WriteLine(person?.Hobbies?[0]);
// Safely access the first element of the Hobbies array
Console.WriteLine(person?.Hobbies?[0]);
Aquí, si person o Hobbies son nulos, la expresión se evalúa como nula en lugar de causar una excepción.
Conclusión
El vídeo de Gerald ofrece una visión en profundidad del operador condicional nulo en C#. Al usar ?. y ?[ ], los desarrolladores pueden escribir código más limpio y seguro que evita la NullReferenceException. Ya se trate de propiedades, objetos anidados o matrices, el operador condicional nulo hace que el código sea más conciso y legible.
Para una demostración completa, no dejes de ver el vídeo de Gerald Versluis, donde lo explica todo con ejemplos prácticos
