1)
Object.ReferenceEquals(item, null)
Esta es una buena manera. No es tan conciso como me gustaría, pero sigue siendo genial y te dice exactamente cuál es la intención.
2)
item == null
item != null
No hay nada malo con esto (que es el más elegante) si está seguro de ==
y posteriormente !=
está sobrecargado correctamente. Es fácil de escribir (sobrecargar) malos operadores de igualdad (y a menudo hecho). Pero el problema real es cuando intenta sobrecargar el operador ==
en una clase (digamos de valor semántico). No puede usar ==
para verificaciones nulas dentro de la función de sobrecarga ==
de la clase since that will cause an infinite recursion. Para tener un estilo consistente, confío en otra cosa.
3)
Object.Equals(item, null)
Una vez más internamente hace un ReferenceEquals
por lo que no tiene mucho sentido, pero si es semánticamente tiene más sentido para usted, y luego ir con esto.
4)
Mi enfoque es hacer
(object)item == null
sobre la que me apoyo en el propio operador de igualdad object
's que no puede ir mal. No así legible por lo que sólo debe ser envuelta en un método de extensión personalizada 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;
}
Tiene más sentido ya que tendrá que comprobar en contra DBNull
es demasiado a menudo. ¡Así que ahora tengo un estilo consistente en todas partes!
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
(No se quite el casting (object)
ya que eso es lo que va a prevenir la repetición infinita cuando la sobrecarga ==
como se dijo antes)
Además la restricción impide IsNull
sobre los 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
También he encontrado (object)item == null
está very very very slightly faster than Object.ReferenceEquals(item, null)
o object.Equals(,)
para el caso, pero sólo si es importante (actualmente estoy trabajando en algo en lo que he de micro-optimizar todo!) .
Para ver una guía completa sobre la utilización de controles de igualdad, ver What is "Best Practice" For Comparing Two Instances of a Reference Type?
Supongamos que uno de éstos eran 10 veces más lento que los demás, y lo utilizaron. ¿Lo notarías? Solo si estuviese en un punto de acceso costoso y raro. –
@MikeDunlavey: Por supuesto, sería absolutamente estúpido elegir el que sea 10 veces más lento que cualquiera de las otras opciones presentadas (suponiendo que las otras opciones sean semánticamente correctas). La optimización no es prematura si la alternativa fuera descabellada y no conllevara ningún beneficio adicional. –
@EdS .: Tal vez es estúpido y tonto, pero la gente lo hace todo el tiempo, y está realmente bien, si está en el código donde el rendimiento no es un problema. Cada vez que las personas 'nuevas' algo, están gastando cubos de ciclos, y si usan un lenguaje interpretado, están pagando una razón de velocidad de 1-2 órdenes de magnitud. –