В то время как просмотр документации 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);
}
Существует ли определенная причина использовать этот бросок или он просто некоторый "бесполезный" код, о котором забывают в этом примере?
Тип может перегрузить оператор ==. Приведение к объекту гарантирует использование исходного определения.
Как говорили другие, тип может переопределить оператор ==. Следовательно, приведение к Object
эквивалентно if (Object.ReferenceEquals (p, null)) {...}
.
Я считаю, что приведение к System.Object поможет вам обойти любую перегрузку оператора что может быть у TwoDPoint.
Это мог быть частью более крупной выборки, в которой оператор == был перегружен. В этом случае использование obj == null могло привести к StackOverflow, если TwoDPoint.Equals (объект) был вызван как часть определения ==.
Вероятно, он существует, чтобы избежать путаницы с перегруженным оператором ==. Представьте, что приведение не существовало, а оператор == был перегружен. Теперь строка 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
, которая будет иметь место (что и задумано).