2010-06-29 11 views
9

¿Hay alguna diferencia en seguir dos líneas de código que compara los valores de cadena?¿Cuál es la diferencia en string.Equals ("string") y "String" .Equals (string)?

string str = "abc"; 

if(str.Equals("abc")) 

y

if("abc".Equals(str)) 

en la primera línea que llamo el método equals de variable de cadena para compararlo con cadena literal. La segunda línea es viceversa. ¿Es solo la diferencia del estilo de codificación o hay una diferencia en la forma en que el compilador procesa estas dos declaraciones?

+6

Nota al margen: '" abc ".Equals (str)' recibe el sobrenombre de "Condición Yoda". –

+0

@Jerord, +1 para indicar el nombre de la condición. – matrix

Respuesta

1

Sí, la forma en que el compilador procesó las declaraciones es diferente. La función igual para String en la mayoría de los idiomas sigue las mismas líneas guía. Aquí está una 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, el método fisrt comprobar que que es una cadena, y que este y que tienen la misma longitud.

se puede ver, como otros señalaron que, si que es null el método devuelve falsa. Por otro lado, el método es parte de String por lo que no se puede llamar en null. Es por eso que en su ejemplo si str es nulo, obtendrá un NullReferenceException.

Dicho esto, si sabe que ambas variables son cadenas no nulas de la misma longitud, ambas declaraciones se evaluarán de la misma manera en el mismo momento.

10

La diferencia es que en el segundo ejemplo, nunca obtendrá un NullReferenceException porque un literal no puede ser nulo.

+2

Pero '((cadena) nulo) .Equals (str)'! (Es una broma.) –

+0

No se puede, nunca es. – ANeves

30

La única diferencia es que, en el primer caso, cuando lo hace:

str.Equals("abc") 

Si str es null, obtendrá una excepción en tiempo de ejecución. Al hacer:

"abc".Equals(str) 

Si str es null, obtendrá false.

+0

es un clásico. ;RE –

4

Como dijo mmyers, el segundo ejemplo no arroja un NullReferenceException y, aunque permite que el programa "parezca" funcionar sin errores, puede provocar resultados no deseados.

7

Para agregar a las otras respuestas: el método estático string.Equals("abc", str) siempre evita activar una excepción de referencia nula, independientemente de qué orden pase las dos cadenas.

Cuestiones relacionadas