2012-11-30 5 views
19

Io non capisco perché ReSharper mi suggerisce di "verificare la presenza di uguaglianza di riferimento, invece" in questo codice:suggerimento ReSharper: verificare la presenza di uguaglianza riferimento invece

if (typeToTranslate.Equals(typeof(string))) 
{ 
    //do something 
} 

perché questo dovrebbe essere meglio:

typeToTranslate == typeof(string) 

------------ ------------ EDIT

Questo è lo stub:

protected IType TranslateType(Type typeToTranslate) 
{ 
    if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate"); 

    //do some stuff 

    if (typeToTranslate.Equals(typeof(string))) 
    { 
     //do some stuff 
    } 
    //return some stuff 
} 
+0

My Resharper non suggerisce questo? – Schoof

+0

@Thomas utilizzo la versione 7.0.1 – giammin

+1

'typeToTranslate' è un oggetto' Tipo' e non un altro tipo? – Servy

risposta

20

Object.Equals è un tipo più generale di uguaglianza rispetto all'uguaglianza di riferimento: se x == y quindi x.Equals(y), ma l'inverso non è necessariamente vero. Tuttavia, come documentato in MSDN Library:

Un Tipo oggetto che rappresenta un tipo è unico; ovvero, due riferimenti a tipo si riferiscono allo stesso oggetto se e solo se rappresentano lo stesso tipo. Ciò consente di confrontare gli oggetti di tipo utilizzando l'uguaglianza di riferimento.

Perché ReSharper categorizza l'opzione di controllo "Controlla per l'uguaglianza di riferimento anziché" in "pratiche comuni e Codice Improvements", la mia ipotesi è che ReSharper è lasciare si sa che sufficiente di utilizzare l'uguaglianza di riferimento per confrontare i tipi; non è necessario il tipo più generale di uguaglianza implicito dal metodo Equals (anche se per i tipi i due sono equivalenti).

14

Dal System.Type documentation:

Un oggetto Type che rappresenta un tipo unico; ovvero, due riferimenti di tipo si riferiscono allo stesso oggetto se e solo se sono rappresentano lo stesso tipo. Ciò consente il confronto degli oggetti Tipo utilizzando l'uguaglianza di riferimento.

Ciò significa che "string".GetType() e typeof(string) restituire il stesso riferimento. Esiste solo una singola istanza dell'oggetto System.Type per System.String in un AppDomain.

Per quanto riguarda il motivo per cui ReSharper dice che è "meglio" utilizzare == anziché .Equals()? La mia ipotesi è perché == è più efficiente e non rischia di lanciare un NullReferenceException se typeToTranslate erano nulli (nel tuo caso).

+0

Controllo che typeToTranslate non sia nullo quindi potrebbe essere solo per l'efficienza – giammin

+0

@giammin: è sufficiente che R # lo suggerisca! – psycho

+0

Il suggerimento appare anche se si scrive 'Equals (typeToTranslate, typeof (string))', quindi è improbabile che 'NullReferenceException' è la ragione. –