Почему приведение к объекту при сравнении с нулем? - PullRequest
17 голосов
/ 04 августа 2010

При просмотре документации 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);
}

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

Ответы [ 5 ]

15 голосов
/ 04 августа 2010

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

15 голосов
/ 04 августа 2010

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

7 голосов
/ 04 августа 2010

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

1 голос
/ 04 августа 2010

Вероятно, существует, чтобы избежать путаницы с перегруженным оператором ==.Представьте, что приведение не существует и оператор == был перегружен.Теперь строка 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 (что и предполагается).

0 голосов
/ 04 августа 2010

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

...