Quando l'override del metodo Equals()
, il MSDN recommends this:Overriding Equals(): il confronto null è ridondante quando si chiama base.Equals()?
class Point: Object {
protected int x, y;
public Point(int X, int Y) {
this.x = X;
this.y = Y;
}
public override bool Equals(Object obj) {
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
Point p = (Point)obj;
return (x == p.x) && (y == p.y);
}
}
Ma se sappiamo che la sottoclasse eredita direttamente da Object
, quindi è il seguente equivalente? Si noti la !base.Equals()
chiamata:
class Point: Object {
protected int x, y;
public Point(int X, int Y) {
this.x = X;
this.y = Y;
}
public override bool Equals(Object obj) {
if (!base.Equals(obj) || GetType() != obj.GetType()) return false;
Point p = (Point)obj;
return (x == p.x) && (y == p.y);
}
}
No, poiché '! Base.Equals (obj)' restituirà 'true', facendo sì che il metodo Equals restituisca' false' se non sono esattamente lo stesso oggetto. Se sono lo stesso oggetto, allora il resto del tuo assegno è garantito per avere successo. In pratica farà in modo che il tuo override non faccia nulla. – Rob
@Rob - se '! Base.Equaliti (obj)' restituisce true, quindi * si desidera * per restituire false. –
'base.Equals (obj)' controllerà se l'oggetto corrente e 'obj' sono lo stesso * esatto * oggetto. Cioè, che sono puntatori allo stesso identico oggetto in memoria. Se sono oggetti diversi, i tuoi pari torneranno immediatamente falsi. Se * sono * lo stesso oggetto, allora 'GetType() == obj.GetType()' e '(x == px) && (y == py)' sono entrambi garantiti per restituire 'true' – Rob