Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

Object.Equals (Método) (Object)

Determina si el objeto especificado es igual al objeto actual.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)
public virtual bool Equals(
	Object obj
)

Parámetros

obj
Tipo: System.Object
Objeto que se va a comparar con el objeto actual.

Valor devuelto

Tipo: System.Boolean
true si el objeto especificado es igual al objeto actual; de lo contrario, false.

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.


using System;

// Define a reference type that does not override Equals.
public class Person
{
   private string personName;

   public Person(string name)
   {
      this.personName = name;
   }

   public override string ToString()
   {
      return this.personName;
   }
}

public class Example
{
   public static void Main()
   {
      Person person1a = new Person("John");
      Person person1b = person1a;
      Person person2 = new Person(person1a.ToString());

      Console.WriteLine("Calling Equals:"); 
      Console.WriteLine("person1a and person1b: {0}", person1a.Equals(person1b));               
      Console.WriteLine("person1a and person2: {0}", person1a.Equals(person2));  

      Console.WriteLine("\nCasting to an Object and calling Equals:");
      Console.WriteLine("person1a and person1b: {0}", ((object) person1a).Equals((object) person1b));
      Console.WriteLine("person1a and person2: {0}", ((object) person1a).Equals((object) person2)); 
   }
}
// The example displays the following output:
//       person1a and person1b: True
//       person1a and person2: False
//       
//       Casting to an Object and calling Equals:
//       person1a and person1b: True
//       person1a and person2: False


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.

    
    using System;
    
    public class Example
    {
       public static void Main()
       {
          byte value1 = 12;
          int value2 = 12;
    
          object object1 = value1;
          object object2 = value2;
    
          Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                            object1, object1.GetType().Name,
                            object2, object2.GetType().Name,
                            object1.Equals(object2));
       }
    }
    // The example displays the following output:
    //        12 (Byte) = 12 (Int32): False
    
    
    
  • 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 .

    
    using System;
    
    // Define a value type that does not override Equals.
    public struct Person
    {
       private string personName;
    
       public Person(string name)
       {
          this.personName = name;
       }
    
       public override string ToString()
       {
          return this.personName;
       }
    }
    
    public struct Example
    {
       public static void Main()
       {
          Person person1 = new Person("John");
          Person person2 = new Person("John");
    
          Console.WriteLine("Calling Equals:"); 
          Console.WriteLine(person1.Equals(person2)); 
    
          Console.WriteLine("\nCasting to an Object and calling Equals:");
          Console.WriteLine(((object) person1).Equals((object) person2));  
       }
    }
    // The example displays the following output:
    //       Calling Equals:
    //       True
    //       
    //       Casting to an Object and calling Equals:
    //       True
    
    
    

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.


using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb1 = new StringBuilder("building a string...");
      StringBuilder sb2 = new StringBuilder("building a string...");

      Console.WriteLine("sb1.Equals(sb2): {0}", sb1.Equals(sb2));
      Console.WriteLine("((Object) sb1).Equals(sb2): {0}", 
                        ((Object) sb1).Equals(sb2));
      Console.WriteLine("Object.Equals(sb1, sb2): {0}",
                        Object.Equals(sb1, sb2));      

      Object sb3 = new StringBuilder("building a string...");
      Console.WriteLine("\nsb3.Equals(sb2): {0}", sb3.Equals(sb2));                              
   }
}
// The example displays the following output:
//       sb1.Equals(sb2): True
//       ((Object) sb1).Equals(sb2): False
//       Object.Equals(sb1, sb2): False
//
//       sb3.Equals(sb2): False


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 .


public class Person
{
   private string idNumber;
   private string personName;

   public Person(string name, string id)
   {
      this.personName = name;
      this.idNumber = id;
   }

   public override bool Equals(Object obj)
   {
      Person personObj = obj as Person; 
      if (personObj == null)
         return false;
      else
         return idNumber.Equals(personObj.idNumber);
   }

   public override int GetHashCode()
   {
      return this.idNumber.GetHashCode(); 
   }
}

public class Example
{
   public static void Main()
   {
      Person p1 = new Person("John", "63412895");
      Person p2 = new Person("Jack", "63412895");
      Console.WriteLine(p1.Equals(p2));
      Console.WriteLine(Object.Equals(p1, p2));
   }
}
// The example displays the following output:
//       True
//       True


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.

bsc2ak47.collapse_all(es-es,VS.110).gifInstrucciones 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.

bsc2ak47.collapse_all(es-es,VS.110).gifInstrucciones 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.

El ejemplo siguiente se muestra una clase Point que invalide el método Equals para proporcionar igualdad de valor, y una clase Point3D que se deriva Point. Dado que Point reemplaza Object.Equals(Object) para comprobar la igualdad de valor, el método Object.Equals(Object) no se denomina. Sin embargo, Point3D.Equals llama Point.Equals porque Point implementa Object.Equals(Object) de una forma que proporciona la igualdad de valores.


using System;

class Point
{
   protected int x, y;

   public Point() {
     this.x = 0;
     this.y = 0;
   }

   public Point(int X, int Y) {
      this.x = X;
      this.y = Y;
   }

   public override bool Equals(Object obj) {
      //Check for null and compare run-time types.
      if (obj == null || this.GetType() != obj.GetType()) { 
         return false;
      }   
      else {
      Point p = (Point) obj;
      return (x == p.x) && (y == p.y);
      }
   }

   public override int GetHashCode() {
      return x ^ y;
   }
}

class Point3D: Point 
{
   int z;

   public Point3D(int X, int Y, int Z) {
      this.x = X;
      this.y = Y;
      this.z = Z; 
   }

   public override bool Equals(Object obj) {
      return base.Equals(obj) && z == ((Point3D)obj).z;
   }

   public override int GetHashCode() {
      return base.GetHashCode() ^ z;
   }
}

class Example 
{
  public static void Main() 
  {
     Point point2D = new Point(5, 5);
     Point3D point3Da = new Point3D(5, 5, 2);
     Point3D point3Db = new Point3D(5, 5, 2);

     if (!point2D.Equals(point3Da)) {
        Console.WriteLine("point2D does not equal point3Da");
     }
     if (!point3Db.Equals(point2D)) {
        Console.WriteLine("point3Db does not equal point2D");
     }
     if (point3Da.Equals(point3Db)) {
        Console.WriteLine("point3Da equals point3Db");
     }

  } 
}
// The example displays the following output:
//       point2D does not equal point3Da
//       point3Db does not equal point2D
//       point3Da equals point3Db


Comprueba si el método Point.Equals para asegurarse de que el argumento obj no es null y que haga referencia a una instancia del mismo tipo que este objeto. Si cualquiera de los errores activados, el método devuelve false.

Las llamadas al método Point.Equals el método GetType para determinar si los tipos en tiempo de ejecución de los dos objetos son idénticos. Si el método utilizado una comprobación del formulario obj is Point en C# o TryCast(obj, Point) en Visual Basic, la comprobación devolvería true en caso de que obj es una instancia de una clase derivada Point, aunque obj y la instancia actual no son del mismo tipo en tiempo de ejecución. Una vez que se haya comprobado que ambos objetos son del mismo tipo, el método convierte obj en el tipo Point y devuelve el resultado de comparar las variables de instancia de los dos objetos.

En Point3D.Equals, se invoca el método heredado Point.Equals , que reemplaza Object.Equals(Object), antes de que se haga nada más. Las comprobaciones heredadas del método Point.Equals para asegurarse de que obj no es null, que obj es una instancia de la misma clase que este objeto, y que las variables de instancia heredadas. Cuando el método heredado Point.Equals vuelve true hace que el método compara las variables de instancia introducidas en la clase derivada. Concretamente, la conversión en Point3D no se ejecuta salvo que se haya determinado que obj sea de tipo Point3D o una clase derivada de Point3D.

El ejemplo siguiente se define una clase Rectangle que internamente implemente un rectángulo como dos objetos Point . La clase Rectangle también invalida Object.Equals(Object) para ofrecer igualdad de valor.


using System;

class Rectangle 
{
   Point a, b;

   public Rectangle(int upLeftX, int upLeftY, int downRightX, int downRightY) {
      this.a = new Point(upLeftX, upLeftY);
      this.b = new Point(downRightX, downRightY);
   }

   public override bool Equals(Object obj) {
     // Performs an equality check on two rectangles (Point object pairs).
      if (obj == null || GetType() != obj.GetType()) 
          return false;
      Rectangle r = (Rectangle)obj;
      //Uses Equals to compare variables.
      return a.Equals(r.a) && b.Equals(r.b);
   }

   public override int GetHashCode() {
      return a.GetHashCode() ^ b.GetHashCode();
   }
}

class Point 
{
  private int x;
  private int y;

  public Point(int X, int Y) {
     this.x = X;
     this.y = Y;
  }

  public override bool Equals (Object obj) {
     // Performs an equality check on two points (integer pairs).
     if (obj == null || GetType() != obj.GetType()) return false;
     Point p = (Point)obj;
     return (x == p.x) && (y == p.y);
  }

  public override int GetHashCode() {
     return x.GetHashCode() ^ y.GetHashCode();
  }
}

class Example 
{
   public static void Main() 
   {
      Rectangle r1 = new Rectangle(0, 0, 100, 200);
      Rectangle r2 = new Rectangle(0, 0, 100, 200);
      Rectangle r3 = new Rectangle(0, 0, 150, 200);

      if (r1.Equals(r2)) {
         Console.WriteLine("Rectangle r1 equals rectangle r2!");
      }
      if (!r2.Equals(r3)) {
         Console.WriteLine("But rectangle r2 does not equal rectangle r3.");
      }
   }
}
// The example displays the following output:
//       Rectangle r1 equals rectangle r2!
//       But rectangle r2 does not equal rectangle r3.


Algunos lenguajes como sobrecarga de operadores admiten de C# y Visual Basic. Cuando un tipo sobrecarga el operador de igualdad, también debe reemplazar el método Equals(Object) para ofrecer la misma funcionalidad. Esto se consigue normalmente escribiendo el método Equals(Object) en términos del operador de igualdad sobrecargado, como en el siguiente ejemplo de código.


using System;

public struct Complex {
   public double re, im;

   public override bool Equals(Object obj) {
      return obj is Complex && this == (Complex)obj;
   }

   public override int GetHashCode() {
      return re.GetHashCode() ^ im.GetHashCode();
   }

   public static bool operator ==(Complex x, Complex y) {
      return x.re == y.re && x.im == y.im;
   }

   public static bool operator !=(Complex x, Complex y) {
      return !(x == y);
   }
}

class MyClass {

  public static void Main() {
    Complex cmplx1, cmplx2;

    cmplx1.re = 4.0;
    cmplx1.im = 1.0;

    cmplx2.re = 2.0;
    cmplx2.im = 1.0;

    if (cmplx1 != cmplx2)
      Console.WriteLine("The two objects are not equal.");
    if (! cmplx1.Equals(cmplx2))
      Console.WriteLine("The two objects are not equal.");

    cmplx2.re = 4.0;

    if (cmplx1 == cmplx2) 
      Console.WriteLine("The two objects are now equal!");
    if (cmplx1.Equals(cmplx2)) 
      Console.WriteLine("The two objects are now equal!");
  }
}
// The example displays the following output:
//       The two objects are not equal.
//       The two objects are not equal.
//       The two objects are now equal!
//       The two objects are now equal!


Dado que Complex es un tipo de valor, no puede derivarse de. Por consiguiente, la invalidación del método Equals(Object) no necesita llamar a GetType para determinar el tipo exacto del runtime de cada objeto, pero puede usar el operador is en C# o el operador TypeOf en Visual Basic para comprobar el tipo de parámetro obj .

.NET Framework

Compatible con: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

© 2013 Microsoft. Reservados todos los derechos.