1)
Object.ReferenceEquals(item, null)
Это хороший способ. Не так лаконично, как хотелось бы, но все равно великолепно, и он точно говорит о намерениях.
2)
item == null
item != null
Там нет ничего плохого в этом (который является самым элегантным), если вы уверены, что ==
и впоследствии !=
правильно перегружен. Его легко писать (перегружать) плохие операторы равенства (и часто делаются). Но настоящая проблема заключается в том, что вы пытаетесь перегрузить оператор ==
в классе (скажем, из семантического значения). Вы не можете использовать ==
для нулевых проверок внутри ==
функция перегрузки класса since that will cause an infinite recursion. Чтобы иметь один последовательный стиль, я полагаюсь на что-то другое.
3)
Object.Equals(item, null)
Опять внутренне делает ReferenceEquals
так что нет особого смысла, но если это семантически имеет смысл для вас, то идти с этим.
4)
Мой подход, чтобы сделать
(object)item == null
, на которой я, опираясь на собственный оператор равенства object
«s, который не может пойти не так. Не так читаемым, так что я просто завернуть в методе пользовательского расширения и перегрузки:
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;
}
Это имеет смысл, так как мне нужно будет проверить на DBNull
слишком часто. Итак, теперь у меня есть единый стиль во всем!
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
(Не снимать (object)
отливку, как это то, что позволит предотвратить зацикливание при перегрузке ==
, как указано выше)
Дополнительно ограничение предотвращает IsNull
на типы значений. Теперь его, как сладко, как вызов
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
Я также нашел (object)item == null
является very very very slightly faster than Object.ReferenceEquals(item, null)
или object.Equals(,)
по этому вопросу, но только если это имеет значение (я в настоящее время работает над чем-то, где я микро-оптимизации все!) ,
Чтобы увидеть полное руководство по вопросам осуществления проверки равенства см What is "Best Practice" For Comparing Two Instances of a Reference Type?
Пусть один из них в 10 раз медленнее, чем другие, и вы ее использовали. Вы заметили бы? Только если бы это было в редкой дорогостоящей горячей точке. –
@MikeDunlavey: Конечно, было бы совершенно глупо выбирать ту, которая в 10 раз медленнее по сравнению с любыми другими представленными параметрами (при условии, что другие параметры семантически правильны). Оптимизация не является преждевременной, если альтернатива была бы голодной и не принесла бы с собой никакой дополнительной выгоды. –
@EdS .: Может быть, это придурок и головокружение, но люди делают это все время, и все в порядке, если это код, где производительность не является проблемой. Всякий раз, когда люди «новые» ничего, они тратят ведра циклов, и если они используют интерпретируемый язык, они платят 1-2 порядка величины скорости. –