Hace algunos años hablábamos de que la forma más correcta de determinar si un objeto es nulo en C# era utilizando el operador is
:
var invoice = _invoiceRepository.GetById(18);
if(invoice is null)
{
// Hacer algo
}
Como vimos en su momento, esta opción era mejor que utilizar una comparación directa como invoice == null
porque el operador de igualdad podía ser sobrecargado y, por tanto, su comportamiento podría ser modificado, mientras que el operador is
no es sobrecargable.
Sin embargo, al comenzar al usar esta fórmula, encontrábamos un pequeño inconveniente cuando queríamos determinar justo lo contrario, es decir, saber cuándo un objeto no es nulo, pues la sintaxis se volvía algo más pesada:
var invoice = _invoiceRepository.GetById(18);
if(!(invoice is null))
{
// Hacer algo
}
La introducción de los patrones de combinación
and
, or
y not
de C# 9 nos ponen la cosa bastante más sencilla. Cuando usamos esta versión del lenguaje, podemos expresar esa comparación con algo tan elegante como lo siguiente:
var invoice = _invoiceRepository.GetById(18);
if(invoice is not null)
{
// Hacer algo
}
Recordad que C#9 es el usado por defecto en proyectos .NET 5, pero también podemos utilizarlo con versiones anteriores de .NET Core o .NET Framework si estamos utilizando una versión actualizada de Visual Studio y configuramos el proyecto para que use la última versión disponible, bien desde el cuadro de diálogo Propiedades del Proyecto > Build > Advanced, o bien añadiendo al .csproj
las siguientes líneas:
<Project ...>
<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>
...
</Project>
Aparte, estos patrones de combinación pueden ser utilizados en otros escenarios. Los veremos más adelante, en un post donde profundizaremos en ello :)
Publicado en Variable not found.
7 Comentarios:
Caramba! Estamos evolucionando a VB?! ("is not nothing")
:DDD Eso parece!
Yo sigo pensando que la forma correcta es utilizar == y != debido a que si estos operadores están sobrecargados, debe ser por una importante razón (ejemplo, el tipo Optional).
Desconozco si en este tipo en concreto está sobrecargado (estoy acostumbrado a acceder a la propiedad HasValue para este propósito) pero entiendo que lo lógico sería que si comparo una instancia de Optional con null, este compruebe si tiene valor.
Hola!
Ciertamente esa sobrecarga no es lo más normal del mundo, y alguna razón habría para que exista... el problema es no controlar su comportamiento. El caso Optional podría ser un buen ejemplo, pero quizás pueda haber otras ocasiones en las que el autor de dicha sobrecarga haya tomado decisiones que puedan ir en contra del funcionamiento previsible de las cosas.
En cualquier caso, lo dicho, son extremos que normalmente no encontraremos. El tema del "is not null" o "is null", en la práctica, probablemente sea un tema más estético que otra cosa.
Saludos!
Me parecía súper interesante, luego leí que nos estamos pareciendo a VB y me dio algo jajaja. Ahora corremos en círculos con los brazos arriba gritando ¡Todos vamos a morir! (los que usamos C#) y nos tocará irnos a rust.
/fin del ataque de pánico
Gracias por el artículo.
Que no cunda el pánico!! :DDD
No pasa nada, lo importante es que nos parezcamos en las cosas buenas (que también las había!!)
Jajajajajaa cabal eso pensé...
Enviar un nuevo comentario