Мой подход - сделать
(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)
, но только в том случае, если это имеет значение (в настоящее время я работаю над чем-то, что я должен микро-оптимизировать все!).
Чтобы ознакомиться с полным руководством по реализации проверок на равенство, см. Что такое «Лучшая практика» для сравнения двух экземпляров ссылочного типа?