Comparar NULL?, con == gracias

Normalmente, nuestro código siempre tiene que lidiar con NULL’s, ese tipo de dato del demonio que ha dado más dolores de cabeza que cualquier otro. El problema con este tipo de dato es que los que apenas están aprendiento no saben o comprenden muy bien que es NULL. Y es que hasta como comprar una instancia con NULL debe ser diferente.

Y es que revisando mi feed en este post se hace referencia a una conferencia de dotNET Conf de Mads Torgersen donde entre otras cosas explica la manera correcta de comprar con tipo nulables, y es que todos, y cuando digo TODOS me incluyo hemos comparado con el viejo conocido operador de igualdad en C#, de qué otro forma se podría comparar? así que este código no tiene nada de malo, cierto?

var audi = new Car { Model = "A3" };
var mercedez = new Car { Model = "CLA" };
var cars = new[] { audi, mercedez };
foreach (var car in cars)
{
	var myFavouriteCar = car == null   ? "I don´t like it!" : "I like it!";
	Console.WriteLine($"Do I like my {car.Model}? {myFavouriteCar}");
}

Console.ReadKey();

Está claro el resulta verdad? (A quién no lo gusta un Mercedez o Audi?), la consola debería mostrar los mensajes de “I like it”, veamos:

Qué ha pasado? por qué se muestra el mensaje de “I dont like it!” si claramente cars no es nulo?. Pues el bueno de Mads explica que como no, este operador puede ser sobreescrito, haciendo que esta comparación nos dé “incorrecta”:

public static bool operator ==(Car first, Car second)
{
	if (first is null || second is null)
	{
		return true;
	}

	return first.Model == second.Model;
}

Por este motivo, insiste en que la manera correcta de hacer este tipo de comparaciones es usando el operador “is” que está disponible desde C# 7, que evalua compatibilidad de tipos en tiempo de ejecución, y así podemos asegurarnos que este operación se efectuada de manera correcta:


static void Main(string[] args)
{
	var audi = new Car { Model = "A3" };
	var mercedez = new Car { Model = "CLA" };

	var cars = new[] { audi, mercedez };

	foreach (var car in cars)
	{
		var myFavouriteCar = car is null ? "I don´t like it!" : "I like it!";

		Console.WriteLine($"Do I like my {car.Model}? {myFavouriteCar}");
	}

	Console.ReadKey();
}

Que arroja como resultado:

Debemos entrar en pánico y salir corriendo a cambiar todas nuestras apps?, no creo que sea para tanto, total este operador es nuevo y comenzar a implementarlo ahora que haz leído este post, es un bueno comienzo :).

Como siempre el código se puede encontrar en mi GitHub:

https://github.com/EduardoOrtegaME/NullCompare

Y como siempre, Happy Coding.

Proco

Software engineer, Gamer, Husband.

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *