2010-08-04 4 views
17

При просмотре документов MSDN по переопределению Equals одна точка привлекла мое внимание.Зачем бросать объект по сравнению с нулевым?

На примерах this specific page, некоторые нулевые чеки сделаны, и объекты отлиты к типу 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); 
} 

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

ответ

15

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

+0

, что делает код exmaple безопасным для копирования и вставки. –

7

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

0

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

15

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

+4

+1 Использование ReferenceEquals яснее для меня, чем приведение объекта – Justin

+0

+1 Цель более четко показана с помощью ReferenceEquals. –

1

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

Смежные вопросы