Мой подход - делать
(object)item == null
на что я полагаюсь на object
собственный оператор равенства, который не может ошибиться. Или собственный метод расширения (и перегрузка):
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;
}
или для обработки большего количества дел может быть:
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
Ограничение предотвращает использование IsNull
типов значений. Теперь это так же мило, как звонить
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
Это означает, что у меня есть один последовательный / не подверженный ошибкам стиль проверки на нули повсюду. Я также обнаружил, что (object)item == null
это очень-очень-очень немного быстрееObject.ReferenceEquals(item, null)
, но только если это имеет значение (в настоящее время я работаю над чем-то, где я должен все микро-оптимизировать!).
Чтобы увидеть полное руководство по внедрению проверок равенства, см. Что такое «лучшая практика» для сравнения двух экземпляров ссылочного типа?
Assert.IsFalse(foo2 == foo1);