2009-03-06 9 views
5

sovraccarico l'operatore di confronto, come confrontare se le due variabili punta allo stesso oggetto (cioè. Non valore)Dopo aver sovraccaricato l'operatore ==, come confrontare se due variabili puntano allo stesso oggetto?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

Cerco di evitare di sovraccaricare questi operatori per i tipi di riferimento, come molte persone si aspetteranno == per testare l'uguaglianza degli oggetti. –

risposta

8

Utilizza gli Object.ReferenceEquals metodo statico.

Ovviamente, affinché il metodo == e! = Mantenga la loro piena funzionalità, è necessario anche eseguire l'override di Equals e GetHashCode in modo che restituiscano un gruppo coerente di risposte ai chiamanti.

4
+0

'ReferenceEquals (object, object)' è un metodo statico della classe 'Object' e non può essere utilizzato in questo modo a meno che non si scriva un metodo di estensione per esso. Per usarlo, si deve chiamare: 'object.ReferenceEquals (a, b)' –

4

Per verificare se entrambi i punti sullo stesso oggetto. Dovresti usare il metodo Object.ReferenceEquals. Restituirà vero se entrambi sono uguali o se entrambi sono nulli. Altrimenti restituirà false

0

So che è una vecchia domanda, ma se hai intenzione di sovraccaricare il metodo == o Object.Equals, dovresti anche sovraccaricare l'operatore inverso! =.

E in questo caso, poiché si confrontano i numeri interni, è necessario sovraccaricare gli altri operatori di confronto <,>, < =,> =.

Le persone che consumano la tua classe in futuro, che si tratti di consumatori di terze parti o di sviluppatori che assumono il tuo codice, potrebbero utilizzare qualcosa come CodeRush o Refactor, che automaticamente "capovolgeranno" la logica (chiamata anche inversione il condizionale) e poi appiattirlo, per uscire dalla sindrome di se nested 25. Se il loro codice lo fa, e hai sovraccaricato l'operatore == senza sovraccaricare l'operatore! =, Potrebbe cambiare il significato previsto del tuo codice.