Почему кастинг для возражения, когда по сравнению с пустым указателем?

В то время как просмотр документации MSDN относительно Равняется переопределениям, одна точка захватила мое внимание.

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

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);
}

Существует ли определенная причина использовать этот бросок или он просто некоторый "бесполезный" код, о котором забывают в этом примере?

17
задан Thibault Falise 4 August 2010 в 15:23
поделиться

5 ответов

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

15
ответ дан 30 November 2019 в 11:37
поделиться

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

15
ответ дан 30 November 2019 в 11:37
поделиться

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

7
ответ дан 30 November 2019 в 11:37
поделиться

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

0
ответ дан 30 November 2019 в 11:37
поделиться

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

1
ответ дан 30 November 2019 в 11:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: