Equals

14/01/2008 - 01:07 por Rolando | Informe spam
Cuando se debe usar Equals en vez del operador de igualdad (==) ?

Preguntas similare

Leer las respuestas

#1 Rolando
14/01/2008 - 01:25 | Informe spam
La pregunta viene por un caso como este que no lo veo muy explicito:

Tengo un form con un TextBox normal, textBox1, puesto en tiempo de diseño,
desde la toolbox.

En un metodo tengo lo siguiente:

textBox1.Text = "valor1"; // da igual si lo escribo interactivamente.

SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", textBox1.Text);

Si hago esta comparacion:
sp1.Value == sp2.Value // me devuelve false

Pero esta:
sp1.Value.Equals(sp2.Value) // me devuelve true

A que se debe la diferencia? Que debo tomar en cuenta para comparar con
seguridad los dos parametros indicados?








"Rolando" escribió en el mensaje
news:
Cuando se debe usar Equals en vez del operador de igualdad (==) ?



Respuesta Responder a este mensaje
#2 Alberto Poblacion
14/01/2008 - 10:11 | Informe spam
"Rolando" wrote in message
news:
La pregunta viene por un caso como este que no lo veo muy explicito:

Tengo un form con un TextBox normal, textBox1, puesto en tiempo de diseño,
desde la toolbox.

En un metodo tengo lo siguiente:

textBox1.Text = "valor1"; // da igual si lo escribo interactivamente.

SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", textBox1.Text);

Si hago esta comparacion:
sp1.Value == sp2.Value // me devuelve false

Pero esta:
sp1.Value.Equals(sp2.Value) // me devuelve true

A que se debe la diferencia? Que debo tomar en cuenta para comparar con
seguridad los dos parametros indicados?



La diferencia se debe a que "Value" es de tipo Object. Aunque en este
caso le tienes metido dentro un String, el compilador no lo sabe, y por
tanto invoca la comparación de objects, que se convierte en un
ReferenceEquals, que compara la dirección en memoria de los dos objetos (y
no el contenido de los objetos, ya que no existe un método universal fiable
para comparar contenidos de objetos cualesquiera). Por eso te devuelve un
false, porque los dos objetos que comparas están en sitios distintos.
En cambio, cuando usas el Equals, como es un método virtual en la clase
Object, se ejecuta el override del mismo que existe dentro de la clase
String, y dicho override está escrito de forma que compara realmente el
valor de los Strings en lugar de delegar en el comportamirnto predeterminado
de la clase object (ReferenceEquals). Por eso te devuelve true.

Si en alguna clase tuya defines el operator==, la recomendación que
aparece en los curosos oficiales de Micorosoft es que redefinas también el
método Equals de forma que ambos tengan el mismo comportamiento, para que su
uso no resulte confuso para los programadores que usen tu clase.
Respuesta Responder a este mensaje
#3 principiante
14/01/2008 - 14:28 | Informe spam
Hola Alberto


La diferencia se debe a que "Value" es de tipo Object. Aunque en este
caso le tienes metido dentro un String, el compilador no lo sabe, y por
tanto invoca la comparación de objects, que se convierte en un
ReferenceEquals, que compara la dirección en memoria de los dos objetos (y
no el contenido de los objetos, ya que no existe un método universal
fiable para comparar contenidos de objetos cualesquiera). Por eso te
devuelve un false, porque los dos objetos que comparas están en sitios
distintos.




Estoy de acuerdo con lo que dices pero tomando el ejemplo de Rolando yo hice
esta prueba:

SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", "valor1");

Y resulta que sp1.value==sp2.value da TRUE!!! . No debería seguir dando
FALSE ya que deberían apuntar a distintas áreas de memoria ?

El mismo caso se da en este otro:
string stt = "valor1";
SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", stt);

Ya terminé confundiendome yo también :(


Jose TH
Respuesta Responder a este mensaje
#4 Alberto Poblacion
14/01/2008 - 15:06 | Informe spam
"principiante" wrote in message
news:%
La diferencia se debe a que "Value" es de tipo Object. Aunque en este
caso le tienes metido dentro un String, el compilador no lo sabe, y por
tanto invoca la comparación de objects, que se convierte en un
ReferenceEquals, que compara la dirección en memoria de los dos objetos
(y no el contenido de los objetos, ya que no existe un método universal
fiable para comparar contenidos de objetos cualesquiera). Por eso te
devuelve un false, porque los dos objetos que comparas están en sitios
distintos.




Estoy de acuerdo con lo que dices pero tomando el ejemplo de Rolando yo
hice esta prueba:

SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", "valor1");

Y resulta que sp1.value==sp2.value da TRUE!!! . No debería seguir dando
FALSE ya que deberían apuntar a distintas áreas de memoria ?

El mismo caso se da en este otro:
string stt = "valor1";
SqlParameter sp1 = new SqlParameter("@p1", "valor1");
SqlParameter sp2 = new SqlParameter("@p1", stt);

Ya terminé confundiendome yo también :(



Estos dos ejemplos son un poco especiales, ya que ninguno de los dos
strings está tecleado en el TextBox, sino que los dos están escritos
directamente en el código fuente. En este caso, el compilador crea una única
cadena "valor1", y apunta a esta única cadena en los dos sitios del código
fuente en los que se usa. Por eso los dos tienen la misma dirección, y la
comparación de direcciones da "true".
Respuesta Responder a este mensaje
#5 principiante
14/01/2008 - 15:48 | Informe spam
Ya terminé confundiendome yo también :(



Estos dos ejemplos son un poco especiales, ya que ninguno de los dos
strings está tecleado en el TextBox, sino que los dos están escritos
directamente en el código fuente. En este caso, el compilador crea una
única cadena "valor1", y apunta a esta única cadena en los dos sitios del
código fuente en los que se usa. Por eso los dos tienen la misma
dirección, y la comparación de direcciones da "true".





Ya veo. Sin duda algo complicadito que confunde a cualquiera. :(


Jose TH
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida