Ha senso se il codice è all'interno della sostituzione Object.Equals
e non si desidera richiamare l'operatore di uguaglianza (che potrebbe, ad esempio, chiamare erroneamente Equals
). La trasmissione su oggetto consente di chiamare l'operatore di uguaglianza standard, che confronta i riferimenti.
Normalmente, è necessario utilizzare Object.ReferenceEquals
per confrontare un'istanza di un oggetto su null
all'interno di override Equals
.
Ad esempio, questo potrebbe causare uno stack overflow:
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;
}
}
In precedenza operatore esempio uguaglianza chiamate Equals
e perché otherPoint
variabile è di tipo Point
, sarebbe invocare l'operatore di uguaglianza, causando ricorsione infinita.
Normalmente, quando si esegue l'override di Equals
e si definisce l'operatore di uguaglianza, si inserisce la logica di confronto nell'operatore e si richiama quella dall'override Equals
. Tieni presente che è consigliabile che la classe sia immutabile se entrambe vengono sovrascritte.
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);
}
}
fonte
2010-05-25 21:54:21
Non è necessario. – ChrisF
Sto aspettando che lui dica questo è come il suo insegnante ha detto di farlo o qualcosa :) – Earlz
Okay ma ... http://msdn.microsoft.com/en-us/library/ms173147(VS.80) .aspx –