Если вы ищете эффективность, я рекомендую использовать это вместо object.ReferenceEquals(foo, null)
:
(object)foo == null
Это фактически эквивалентно, но позволяет избежать вызова функции.
Мне также нравится реализовывать IEquatable<T>
во всех моих типах, которые переопределяют Equals
. Для справочных типов я затем пересылаю Equals(object)
на Equals(Foo)
.
public override bool Equals(object other){return Equals(other as Foo);}
Перегрузки оператора могут быть упрощены следующим образом:
public static bool operator==(Foo a, Foo b){
if((object)a == null)
return (object)b == null;
return a.Equals(b);
}
public static bool operator!=(Foo a, Foo b){
return !(a == b);
}
Если требуется абсолютная эффективность, тем не менее, возможно, стоит немного дублировать код в этих функциях, чтобы избежать дополнительных вызовов функций, но в отличие от использования (object)foo == null
вместо object.ReferenceEquals(foo, null)
, избегая Для вызова функции требуется дополнительный код, поэтому небольшой выигрыш может не стоить.