Mi enfoque es hacer
(object)item == null
en el que confío en object
el propio operador de igualdad que no puede fallar. O un método de extensión personalizado (y una sobrecarga):
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null;
}
public static bool IsNull<T>(this T? obj) where T : struct
{
return !obj.HasValue;
}
o para manejar más casos, puede ser:
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
La restricción impide los IsNull
tipos de valor. Ahora es tan dulce como llamar
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
lo que significa que tengo un estilo consistente / no propenso a errores de verificación de nulos en todo momento. También he descubierto que (object)item == null
es muy, muy ligeramente más rápido queObject.ReferenceEquals(item, null)
, pero solo si importa (¡actualmente estoy trabajando en algo en lo que tengo que micro-optimizar todo!).
Para ver una guía completa sobre la implementación de verificaciones de igualdad, consulte ¿Cuál es la "práctica recomendada" para comparar dos instancias de un tipo de referencia?
Assert.IsFalse(foo2 == foo1);