Compartir a través de


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

A veces es necesario comparar dos valores para la igualdad. En algunos casos, está probando la igualdad de valores, también conocida como equivalencia, lo que significa que los valores contenidos en las dos variables son iguales. En otros casos, debe determinar si dos variables hacen referencia al mismo objeto subyacente en 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 ocurrir a través de 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) = {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) = {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 lo tanto, tienen igualdad de referencia. Use el ReferenceEquals método para determinar si dos referencias hacen referencia al mismo objeto.

El concepto de igualdad de referencia solo se aplica a los tipos de referencia. Los objetos de tipo de valor no pueden tener igualdad de referencia porque cuando se asigna una instancia de un tipo de valor a una variable, se realiza una copia del valor. Por lo tanto, nunca puede tener dos estructuras no encapsuladas que se refieren a la misma ubicación en la memoria. Además, si usa ReferenceEquals para comparar dos tipos de valor, el resultado siempre será false, incluso si los valores contenidos en los objetos son idénticos. Esto se debe a que cada variable está empaquetada en una instancia de objeto independiente. Para obtener más información, vea Cómo probar la igualdad de referencia (Identidad).

Igualdad de valores

La igualdad de valores significa que dos objetos contienen el mismo valor o valores. En el caso de los tipos de valor primitivos, como int o bool, las pruebas para la 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 requiere que comprenda cómo lo define el tipo. En el caso de las clases y estructuras que tienen varios campos o propiedades, la igualdad de valores suele definirse para indicar que todos los campos o propiedades tienen el mismo valor. Por ejemplo, se pueden definir dos Point objetos para que sean equivalentes si pointA.X es igual a pointB.X y pointA.Y es igual a pointB.Y. Para 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.

Sin embargo, no es necesario que la equivalencia se base en todos los campos de un tipo. Se puede basar en un subconjunto. Al comparar tipos que no posee, debe asegurarse de comprender específicamente cómo se define la equivalencia para ese tipo. Para obtener más información sobre cómo definir la igualdad de valores en sus propias clases y estructuras, vea Cómo definir la igualdad de valores para un tipo.

Igualdad de valores para los valores 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 punto flotante en equipos binarios. Para obtener más información, vea los comentarios del tema System.Double.

Título Descripción
Cómo probar la igualdad de referencias (Identidad) Describe cómo determinar si dos variables tienen igualdad de referencia.
Definición de 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 enlaces a información adicional.
Registros Proporciona información sobre los tipos de registro, que prueban la igualdad de valores de forma predeterminada.