Tipos Nullable (?)
El operador ?
se usa para convertir un tipo de valor en un tipo de valor nullable, el cual puede contener un valor nulo.
int? numeroNullable = null;
if(numeroNullable.HasValue)
{
Console.WriteLine(numeroNullable);
}
Acceso condicional nulo a miembros (?.
o ?[]
)
Este operador permite acceder a un miembro de un objeto solo si el objeto no es nulo, evitando asi una NullReferenceException
. Si no se cumple, devuelve null
.
- si
a
es nulo, el resultado dea?.x
oa?[x]
esnull
- si
a
no es nulo, el resultado dea?.x
oa?[x]
es el mismo quea.x
oa[x]
string[] nombres = null;
int? longitud = nombres?.Length; // asigna null en lugar de lanzar una excepcion
(!) (revisar como usarlo mejor junto al operador ??
) (!)
Coalescencia de Nulos (??)
Se usa para proporcionar un valor por defecto en caso de que una expresion nullable contenga un null.
sin este operador
string name = GetName();
if(name == null)
{
name = "unknown";
}
se reemplaza por esto usando el operador
string name = GetName() ?? "unknown";
Se recomienda usar ??
en vez de expresiones ternarias para comprobar un null
// no usar esto
var v = x != null ? x : y; // or
var v = x == null ? x : y;
// y usar esto en su lugar
var v = x ?? y;
(!) También se puede usar junto al operador ?.
para asignar un valor por defecto en caso de que sea nulo (!)
string[] nombres = ...; // whatever
string nombre = nombres?[index] ?? "NotFound"; // array is null or name not found
Se puede usar junto a un throw
para hacer más concisa la asignación de valores.
public string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
}
Asignacion de coalescencia de nulos (??=)
reemplaza este formato de código
if (variable is null)
{
variable = "something";
}
por esto. lo hace más conciso
variable ??= "something";
Reference(s)
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator
https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0029-ide0030-ide0270
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators–and-