Если this
равно нулю, код не может быть вызван, поэтому не нужно рассматривать этот случай (во всяком случае, в C # есть случаи, когда языки допускают, чтобы у нулевого объекта был разыменован метод, хотя, очевидно, если он внутреннепроверяет любое из своих несуществующих полей, в которых он выдаст ошибку. Рассмотрим:
return x.Equals(y);
Если x равен нулю, мы даже не можем вызвать Equals
для проверки на нулевое значение.
Следовательно, нам нужно только рассмотреть:
public bool Equals(T obj)
{
if(obj == null)
return false;
//logic defining equality here.
}
Когда возникает вероятность того, что оба объекта имеют нулевое значение, это когда мы исследуем их из статического переопределения оператора ==
или из IEqualityComparer<T>
реализация:
public bool Equals(T x, T y)
{
if(x == null)
return y == null;
if(y == null)
return false;
//logic defining equality here.
}
Обратите внимание, что здесь полезный ярлык, если равенство может быть длинным для определения (например, сравнение длинных строк), тогда мы можем воспользоваться тем фактом, что идентичность влечет за собой равенство - то есть что-то всегда равнодаже Айн Рэнд мог бы понять это;) Существуют также алгоритмы, которые делают сравнение элемента с самим собой довольно распространенным, что делает этот ярлык хорошо стоящим.ЛУДИНГ.В этом случае сравнение идентификаторов уже включает проверку того, что оба значения равны нулю, поэтому мы пропускаем это снова:
public bool Equals(T x, T y)
{
if(ReferenceEquals(x, y))
return true;
if(x == null || y == null)
return false;
//logic defining equality here.
}