2015-06-12 6 views
7

Ho visto nel codice souce del tipo GUID in .NET Framework che l'implementazione di Equals e l'operatore == eseguono codice molto simile.Perché does == call di implementazione è uguale a Guid?

Perché l'operatore == non chiama il metodo Equals sul primo argomento? Qualcosa di simile a questo:

public static bool operator ==(Guid a, Guid b) 
{ 
    return a.Equals(b); 
} 
+3

Votazione per chiusura in base ad un'opinione, non possiamo leggere le menti dei progettisti di framework/sviluppatori. – BradleyDotNET

+0

Penso che sia dovuto a problemi primitivi vs oggetto – nafas

+1

La mia ipotesi sarebbe che l'implementazione dell'operatore esistesse prima dell'aggiunta di 'IEquatable' al framework. Quando è stato aggiunto, hanno scelto di duplicare il codice operatore piuttosto che riscriverlo (forse una politica per evitare di cambiare il vecchio codice?) Questa è pura speculazione, però. Potrebbe anche essere una considerazione di ottimizzazione estremamente ridotta per una linea più aggressiva, ma in questo caso non mi sembrerebbe un motivo particolarmente valido per la ripetizione del codice. O è stato solo un errore e nessuno nella revisione del codice ha pensato che fosse abbastanza brutto da valere lo sforzo di risolvere. –

risposta

5

Il commento è molto eloquente:

public static bool operator ==(Guid a, Guid b) 
{ 
    // Now compare each of the elements 

Questo non ha senso di per sé. Alla ricerca di quella commento altrove nel file:

public bool Equals(Guid g) 
{ 
    // Now compare each of the elements 

ma anche

// Returns true if and only if the guid represented 
// by o is the same as this instance. 
public override bool Equals(Object o) 
{ 
    Guid g; 
    // Check that o is a Guid first 
    if(o == null || !(o is Guid)) 
     return false; 
    else g = (Guid) o; 

    // Now compare each of the elements 

Il commento ha senso solo in questo ultimo metodo. Questa è un'indicazione molto forte che l'implementazione Guid.Equals(Object) è arrivata per prima.

Sarebbe male, o almeno non ottimale, se Guid.operator == e Guid.Equals(Guid) stati attuati in cima Guid.Equals(Object), come quello ultimo metodo richiede allocazioni inutili, e mentre difficilmente sarà evidente nei casi più comuni, ci sono certamente i confronti Guid che si verificano in qualche codice in cicli stretti in cui le allocazioni sarebbero misurabili.

Ora, sarebbe stato sicuramente possibile utilizzare operator == per utilizzare Equals(Guid) o viceversa, ma in realtà non è necessario alcun lavoro aggiuntivo per copiarlo e incollarlo due volte anziché una volta.

+1

Con i commenti piuttosto noiosi, come "prima verifica questo è un GUID", sembra che questo sia stato implementato da uno sviluppatore piuttosto nuovo, che potrebbe non avere familiarità con il principale di DRY :) –

+2

@YuvalItzchakov Anche che il 'o = = null' è ridondante: if 'o == null', quindi'! (o is Guid) 'è necessariamente vero. – hvd