Это имеет смысл, если этот код внутри Object.Equals
переопределить, и вы не хотите ссылаться на оператор равенства (который, например, может ошибочно вызвать Equals
). Выделение объекта позволяет вызывать стандартный оператор равенства, который сравнивает ссылки.
Как правило, вы должны использовать Object.ReferenceEquals
, чтобы сравнить экземпляр объекта с null
внутри Equals
переопределить.
Например, это может вызвать переполнение стека:
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
if (other == null)
return false;
//...
}
public static bool operator == (Point l, Point r) {
//...
//null checks
if (!l.Equals(r))
return false;
}
}
В приведенном выше примере оператор равенства вызывает Equals
и потому otherPoint
переменная типа Point
, он будет ссылаться оператор равенства, что приводит к бесконечной рекурсии.
Обычно, когда вы переопределяете Equals
и определяете оператор равенства, вы должны поставить логику сравнения в оператор и вызвать из переопределения Equals
. Имейте в виду, что рекомендуется, чтобы класс был неизменным, если оба они переопределены.
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
return this == otherPoint;
}
//must override GetHashCode() as well
public static bool operator == (Point l, Point r) {
if (Object.ReferenceEquals(l, null) && Object.ReferenceEquals(r, null))
return true;
if (Object.ReferenceEquals(l, null) || Object.ReferenceEquals(r, null))
return false;
//actual equality checks
}
public static bool operator != (Point l, Point r) {
return !(l==r);
}
}
Вам не нужно. – ChrisF
Я жду его, чтобы сказать, что это его учитель сказал, чтобы сделать это или что-то такое :) – Earlz
Хорошо, но ... http://msdn.microsoft.com/en-us/library/ms173147(VS.80) .aspx –