Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 25 de mayo de 2021
.NET Core

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:

Cerebrado dijo...

Caramba! Estamos evolucionando a VB?! ("is not nothing")

José María Aguilar dijo...

:DDD Eso parece!

MontyCLT dijo...

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.

José María Aguilar dijo...

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!

Juan Bastidas dijo...

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.

José María Aguilar dijo...

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!!)

Anónimo dijo...

Jajajajajaa cabal eso pensé...