Comparaciones de igualdad (guía de programación de C#)

A veces es necesario comparar si dos valores son iguales. En algunos casos, se prueba la igualdad de valores, también denominada equivalencia, lo que significa que los valores contenidos en las dos variables son iguales. En otros casos, hay que determinar si dos variables hacen referencia al mismo objeto subyacente de la memoria. Este tipo de igualdad se denomina igualdad de referencia o identidad. En este tema se describen estos dos tipos de igualdad y se proporcionan vínculos a otros temas para obtener más información.

Igualdad de referencia

La igualdad de referencia significa que dos referencias de objeto hacen referencia al mismo objeto subyacente. Esto puede suceder mediante una asignación simple, como se muestra en el ejemplo siguiente.

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);
    }
}

En este código, se crean dos objetos, pero después de la instrucción de asignación, ambas referencias hacen referencia al mismo objeto. Por consiguiente, presentan igualdad de referencia. Use el método ReferenceEquals para determinar si dos referencias hacen referencia al mismo objeto.

El concepto de igualdad de la referencia solo se aplica a los tipos de referencia. Los objetos de tipo de valor no pueden presentar igualdad de referencia porque al asignar una instancia de un tipo de valor a una variable, se realiza una copia del valor. Por consiguiente, nunca puede haber dos structs con conversión unboxing que hagan referencia a la misma ubicación de la memoria. Además, si se usa ReferenceEquals para comparar dos tipos de valor, el resultado siempre será false, aunque todos los valores que contengan los objetos sean idénticos. Esto se debe a que a cada variable se aplica la conversión boxing en una instancia de objeto independiente. Para más información, consulte Procedimiento Probar la igualdad de referencia (Identidad).

Igualdad de valores

La igualdad de valores significa que dos objetos contienen el mismo valor o valores. Para los tipos de valor primitivos, como int o bool, las pruebas de igualdad de valores son sencillas. Puede usar el operador ==, como se muestra en el ejemplo siguiente.

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

Para la mayoría de los otros tipos, las pruebas de igualdad de valores son más complejas, porque es preciso entender cómo la define el tipo. Para las clases y los structs que tienen varios campos o propiedades, la igualdad de valores suele definirse de modo que significa que todos los campos o propiedades tienen el mismo valor. Por ejemplo, podrían definirse dos objetos Point que fueran equivalentes si pointA.X es igual a pointB.X y pointA.Y es igual a pointB.Y. En el caso de los registros, la igualdad de valores significa que dos variables de un tipo de registro son iguales si los tipos coinciden y todos los valores de propiedad y campo coinciden.

En cambio, no hay ningún requisito que exija que la equivalencia se base en todos los campos de un tipo. Se puede basar en un subconjunto. Al comparar tipos que no sean de su propiedad, es importante asegurarse concretamente de cómo se define la equivalencia para ese tipo. Para más información sobre cómo definir la igualdad de valores en sus propias clases y structs, consulte Procedimiento Definir la igualdad de valores para un tipo.

Igualdad de valores en valores de número de punto flotante

Las comparaciones de igualdad de valores de punto flotante (double y float) son problemáticas debido a la imprecisión de la aritmética de número de punto flotante en los equipos binarios. Para obtener más información, vea los comentarios en el tema System.Double.

Title Descripción
Procedimiento Probar la igualdad de referencia (Identidad) Describe cómo determinar si dos variables presentan igualdad de referencia.
Procedimiento Definir la igualdad de valores para un tipo Describe cómo proporcionar una definición personalizada de igualdad de valores para un tipo.
Tipos Proporciona información sobre el sistema de tipos de C# y vínculos a información adicional.
Registros Proporciona información sobre los tipos de registro, que comprueban la igualdad de valores de forma predeterminada.