2010-06-29 5 views
9

Esiste qualche differenza nel seguire due righe di codice che confrontano i valori di stringa.Qual è la differenza in string.Equals ("stringa") e "String" .Equals (stringa)?

string str = "abc"; 

if(str.Equals("abc")) 

e

if("abc".Equals(str)) 

in prima linea che chiamo il metodo equals sulla variabile stringa per confrontarlo con stringa letterale. La seconda linea è viceversa. È solo la differenza di stile di codifica o c'è una differenza nel modo in cui queste due istruzioni vengono elaborate dal compilatore.

+6

Nota a margine: '" abc ".Equals (str)' è soprannominato "Condizione Yoda". –

+0

@Jerord, +1 per indicare il nome della condizione. – matrix

risposta

1

Sì, il modo in cui il compilatore ha elaborato le istruzioni è diverso. La funzione è uguale a String nella maggior parte delle lingue segue le stesse linee guida. Ecco un semicode:

override def Equals(that:String):Boolean //Should override Object.Equals 
    if(that==null) return false 
    for i from 0 to this.length 
    if(!this(i).Equals(that(i))) return false 
    return true 

Normalmente, il metodo fisrt verificare che che è una stringa, e che questa e che hanno la stessa lunghezza.

si può vedere, come altri hanno sottolineato, che se che è null il metodo restituisce falsa. D'altra parte, il metodo fa parte di String, quindi non può essere chiamato su null. Questo è il motivo per cui nel tuo esempio se str è nullo riceverai un NullReferenceException.

Detto questo, se si conoscono entrambe le variabili non stringhe Null della stessa lunghezza, entrambe le istruzioni valuteranno allo stesso modo nello stesso tempo.

10

La differenza è che nel secondo esempio, non si otterrà mai un NullReferenceException perché un valore letterale non può essere nullo.

+2

Ma '((stringa) null) .Equals (str)'! (Sto scherzando.) –

+0

Non posso, non è mai. – ANeves

30

L'unica differenza è che, nel primo caso, quando si esegue:

str.Equals("abc") 

Se str è null, si otterrà un'eccezione in fase di esecuzione. Facendo:

"abc".Equals(str) 

Se str è null, si otterrà false.

+0

è un classico. ; D –

4

Come hanno detto gli utenti, il secondo esempio non genererà un valore NullReferenceException e, mentre consente al programma di "apparire" di eseguire errori, potrebbe portare a risultati indesiderati.

7

Per aggiungere alle altre risposte: il metodo statico string.Equals("abc", str) evita sempre di attivare un'eccezione di riferimento null, indipendentemente dall'ordine in cui si passano le due stringhe.

Problemi correlati