Подтвердить что ты не робот

Почему кастинг для объекта при сравнении с нулевым?

Во время просмотра документации MSDN по переопределению Equals одна точка привлекла мое внимание.

На примерах этой конкретной страницы, выполняются некоторые нулевые проверки, а объекты выполняются в тип System.Object при выполнении сравнение:

public override bool Equals(System.Object obj)
{
    // If parameter is null return false.
    if (obj == null)
    {
        return false;
    }

    // If parameter cannot be cast to Point return false.
    TwoDPoint p = obj as TwoDPoint;
    if ((System.Object)p == null)
    {
        return false;
    }

    // Return true if the fields match:
    return (x == p.x) && (y == p.y);
}

Есть ли конкретная причина для использования этого акта, или это просто какой-то "бесполезный" код, забытый в этом примере?

4b9b3361

Ответ 1

Возможно, что тип перегружает оператор ==. Приведение к объекту гарантирует, что используется исходное определение.

Ответ 2

Как говорили другие, тип может переопределить оператор ==. Поэтому приведение к Object эквивалентно if (Object.ReferenceEquals(p, null)) { ... }.

Ответ 3

Я считаю, что приведение в System.Object приведет вас к любой перегрузке оператора, которую может иметь TwoDPoint.

Ответ 4

Вероятно, существует вероятность избежать путаницы с перегруженным оператором ==. Представьте себе, что листинг не существует, а оператор == был перегружен. Теперь строка p == null потенциально будет связана с оператором ==. Многие реализации оператора == просто переносят на переопределенный метод Equals. Это может легко вызвать ситуацию с переполнением стека.

public static bool operator==(TwoDPoint left, TwoDPoint right) {
  return left.Equals(right);
}

public override bool Equals(System.Object obj) {
    ...
    TwoDPoint p = obj as TwoDPoint;
    if ( p == null ) {  // Stack overflow!!!
        return false;
    }

    ...
}

Отбрасывая на Object, автор обеспечивает простую контрольную проверку для null (это то, что предназначено).

Ответ 5

Это могло быть частью более крупной выборки, где оператор == был перегружен. В этом случае использование obj == null могло привести к StackOverflow, если в качестве определения определения == был использован TwoDPoint.Equals(object).