El tipo de comparación entre la instancia actual y el parámetro obj depende de si la instancia actual es un tipo de referencia o un tipo de valor. Si la instancia actual es un tipo de referencia, el método Equals(Object) prueba de igualdad de referencia, y una llamada al método Equals(Object) equivale a una llamada al método ReferenceEquals . La igualdad de referencias significa que las variables de objeto se comparan que hacen referencia al mismo objeto. El ejemplo siguiente se muestra el resultado de la comparación. Define una clase Person , que es un tipo de referencia, y llama al constructor de clase Person para crear instancias de dos objetos nuevos, person1a y person2de Person , que tienen el mismo valor. También asigna person1a a otra variable de objeto, person1b. Como muestra el resultado del ejemplo, person1a y person1b son iguales porque hacen referencia al mismo objeto. Sin embargo, person1a y person2 no son iguales, aunque tienen el mismo valor.
No hay ningún ejemplo de código disponible o este idioma no es compatible.
Si la instancia actual es un tipo de valor, el método Equals(Object) pruebas de igualdad de valores. La igualdad de valores significa lo siguiente:
Los dos objetos son del mismo tipo. Como se muestra en el ejemplo siguiente, un objeto Byte que tiene un valor de 12 no es un objeto Int32 que tiene un valor de 12, porque los dos objetos tienen distintos tipos en tiempo de ejecución.
No hay ningún ejemplo de código disponible o este idioma no es compatible.
Los valores de los campos públicos y privados de los dos objetos son iguales. Las pruebas siguientes de ejemplo para la igualdad de valores. Define una estructura Person , que es un tipo de valor, y llama al constructor de clase Person para crear instancias de dos objetos nuevos, person1 y person2de Person , que tienen el mismo valor. Como el resultado del ejemplo, aunque las dos variables de objeto hacen referencia a distintos objetos, person1 y person2 son iguales porque tienen el mismo valor para el campo privado personName .
No hay ningún ejemplo de código disponible o este idioma no es compatible.
Dado que la clase Object es la clase base para todos los tipos de .NET Framework, el método Object.Equals(Object) proporciona la comparación predeterminada de igualdad para todos los demás tipos. Sin embargo, los tipos reemplazan a menudo el método Equals para implementar la igualdad de valores. Para obtener más información, vea las notas de los llamadores y notas para las secciones de los herederos.
Notas para los llamadores
Las clases derivadas con frecuencia reemplazan el método Object.Equals(Object) para implementar la igualdad de valores. Además, los tipos también con frecuencia proporcionan una sobrecarga fuertemente tipada adicional al método Equals . Cuando se llama al método Equals para comprobar la igualdad, debe conocer si la instancia actual invalida Object.Equals y entender cómo una llamada concreta a un método Equals se resuelve. Si no, puede realizar una prueba de igualdad que es diferente del concretas, y el método puede devolver un valor inesperado.
Esto se muestra en el ejemplo siguiente. Crea una instancia de tres objetos StringBuilder con cadenas idénticas y, a continuación cuatro llamadas a métodos Equals . Que quedan la primera llamada al método devuelve true, y tres falsereturn.
No hay ningún ejemplo de código disponible o este idioma no es compatible.
En el primer caso, se llama a la sobrecarga fuertemente tipada del método StringBuilder.Equals(StringBuilder) , para comprobar la igualdad de valores. Dado que las cadenas asignadas a los dos objetos StringBuilder son iguales, el método devuelve true. Sin embargo, StringBuilder no reemplaza Object.Equals(Object). Por ello, cuando el objeto StringBuilder se convierte a Object, cuando una instancia StringBuilder se asigna a una variable Objectescrito y, cuando el método Object.Equals(Object, Object) se pasa dos objetos StringBuilder , el método Object.Equals(Object) predeterminado se denomina. Dado que StringBuilder es un tipo de referencia, es equivalente a pasar los dos objetos StringBuilder al método ReferenceEquals . Aunque los tres objetos StringBuilder contienen cadenas idénticas, hacen referencia a tres objetos distintos. Como resultado, estas tres llamadas a métodos devuelven false.
Puede comparar el objeto actual con otro objeto para la igualdad de la referencia llamando al método ReferenceEquals. En Visual Basic, puede utilizar la palabra clave (por ejemplo, If Me Is otherObject Then ...) is también.
Notas a herederos.
Cuando se define el propio tipo, ese tipo hereda la funcionalidad definida por el método Equals de su tipo base. La tabla siguiente muestra la implementación predeterminada del método Equals para las categorías principales de tipos de .NET Framework.
Categoría de tipo | Igualdad definida por | Comentarios |
|---|
Clase derivada directamente Object | Object.Equals(Object) | Igualdad de referencia; equivalente a Object.ReferenceEquals. |
Estructura | ValueType.Equals | Igualdad de valor; comparación directa de byte-por- byte o comparación de campo-por- campo mediante la reflexión. |
Enumeración | Enum.Equals | Los valores deben tener el mismo tipo de enumeración y el mismo valor subyacente. |
Delegado | MulticastDelegate.Equals | Los delegados deben tener el mismo tipo con listas de invocación idénticas. |
Interfaz | Object.Equals(Object) | Igualdad de referencia. |
También puede invalidar la implementación predeterminada Equals para comprobar la igualdad de valores en lugar de igualdad de referencia y definir el significado exacto de igualdad de valores. Tales implementaciones de retorno trueEquals si los dos objetos tienen el mismo valor, aunque no son la misma instancia. El implementador de tipo decide qué constituye el valor de un objeto, pero suele ser varios o todos los datos almacenados en las variables de instancia del objeto. Por ejemplo, el valor de un objeto String se basa en los caracteres de la cadena; el método String.Equals(Object) invalida el método Object.Equals(Object) para devolver true para cualquier dos instancias de la cadena que contiene los mismos caracteres en el mismo orden.
El ejemplo siguiente muestra cómo invalidar el método Object.Equals(Object) para comprobar la igualdad de valores. Invalida el método Equals para la clase Person . Si Person aceptara la implementación de la clase base de igualdad, dos objetos Person se iguales sólo si se hizo referencia a un único objeto. Sin embargo, en este caso, dos objetos Person son iguales si tienen el mismo valor para la propiedad Person.Id .
No hay ningún ejemplo de código disponible o este idioma no es compatible.
Las instrucciones siguientes deben ser true para todas las implementaciones del método Equals(Object). En la lista, x, y, y z representan las referencias a objetos que no son null.
x.Equals(x) devuelve true, excepto en los casos que implican tipos de punto flotante. Vea el 60559:2011 de ISO/IEC/IEEE, TI -- Sistemas de microprocesador -- Aritmética flotante.
x.Equals(y) devuelve el mismo valor que y.Equals(x).
x.Equals(y) devuelve true si x y y son NaN.
Si (x.Equals(y) && y.Equals(z)) devuelve true, después x.Equals(z) devuelve true.
Las llamadas sucesivas a x.Equals(y) devuelven el mismo valor siempre que los objetos a los que hace referencia x y y no se modifiquen.
x.Equals(null) devuelve false.
Las implementaciones de Equals no deben producir excepciones.
Siga estas instrucciones al reemplazar Equals(Object):
Los tipos que implementan IComparable deben reemplazar el método Equals(Object).
Los tipos que reemplazan Equals(Object) también deben reemplazar GetHashCode; si no, las tablas hash podrían no funcionar correctamente.
Si el lenguaje de programación admite la sobrecarga de operadores y se sobrecarga el operador de igualdad para un tipo determinado, también debe reemplazar el método Equals(Object) devuelva el mismo resultado que el operador de igualdad. Esto ayuda a garantizar que el código de biblioteca de clases que utilice Equals (como ArrayList y Hashtable) se comporta de forma coherente con la manera en que el código de aplicación usa el operador de igualdad.
Instrucciones para los tipos de referencia
Las instrucciones siguientes se aplican a reemplazar Equals(Object) un tipo de referencia:
Considere reemplazar Equals si la semántica de tipos se basa en el hecho de que el tipo representa algunos valores.
La mayoría de los tipos de referencia no deben sobrecargar el operador de igualdad, aunque reemplacen el método Equals. No obstante, cuando se implemente un tipo de referencia destinado a tener semántica de valor, como un tipo de número complejo, debe reemplazarse el operador de igualdad.
Instrucciones para los tipos de valor
Las instrucciones siguientes se aplican a reemplazar Equals(Object) un tipo de valor:
Si define un tipo de valor que incluya uno o más campos cuyos valores son tipos de referencia, debe invalidar Equals(Object). La implementación Equals(Object) proporcionada por ValueType realiza una comparación de byte-por- bytes para los tipos de valor cuyos campos son todos los tipos de valor, pero utiliza la reflexión para realizar una comparación de campo-por- campo de los tipos de valor cuyos campos incluyen los tipos de referencia.
Si reemplaza Equals y el lenguaje de desarrollo admite la sobrecarga de operadores, debe sobrecargar el operador de igualdad.