Partilhar via


Comparações de igualdade (Guia de Programação em C#)

Às vezes é necessário comparar dois valores para igualdade. Em alguns casos, você está testando para igualdade de valor, também conhecido como equivalência, o que significa que os valores contidos pelas duas variáveis são iguais. Em outros casos, você precisa determinar se duas variáveis referem-se ao mesmo objeto subjacente na memória. Esse tipo de igualdade é chamado de igualdade de referência ou de identidade. Este tópico descreve esses dois tipos de igualdade e oferece links para outros tópicos para obter mais informações.

Igualdade de referência

A igualdade de referência significa que duas referências a objetos referem-se ao mesmo objeto subjacente. Isso pode ocorrer por meio de uma atribuição simples, como mostrado no exemplo a seguir.

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

    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);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

Nesse código, dois objetos são criados, mas após a instrução de atribuição, ambas as referências se referem ao mesmo objeto. Portanto, eles têm igualdade de referência. Use o método ReferenceEquals para determinar se as duas referências referem-se ao mesmo objeto.

O conceito de igualdade de referência se aplica somente a tipos de referência. Os objetos do tipo de valor não podem ter a igualdade de referência, pois quando uma instância de um tipo de valor é atribuída a uma variável, uma cópia do valor é feita. Dessa forma, você nunca terá duas estruturas desconvertidas que façam referência à mesma alocação na memória. Além disso, se você usar ReferenceEquals para comparar dois tipos de valor, o resultado será sempre false, mesmo se os valores contidos nos objetos forem todos idênticos. Isso ocorre porque cada variável é convertida em uma instância separada do objeto. Para obter mais informações, consulte Como testar a igualdade de referência (identidade) (Guia de Programação em C#).

Igualdade de valor

A igualdade de valor significa que dois objetos contém o mesmo valor ou valores. Para tipos de valores primitivos como int ou bool, os testes para igualdade de valores são simples. É possível usar o operador ==, conforme mostrado no exemplo a seguir.

int a = GetOriginalValue();
int b = GetCurrentValue();

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

Para a maioria dos outros tipos, testar a igualdade do valor é mais complexo porque requer que você entenda como o tipo o define. Para as classes e estruturas que têm vários campos ou propriedades, a igualdade de valores é geralmente definida para indicar que todos os campos ou propriedades têm o mesmo valor. Por exemplo, dois objetos Point podem ser definidos para ser equivalentes se pointA.X for igual a pointB.X e pointA.Y for igual a pointB.Y.

No entanto, não há requisitos para que a equivalência seja baseada em todos os campos de um tipo. Pode ser baseada em um subconjunto. Ao comparar os tipos que você não possui, é necessário certificar-se de entender especificamente como a equivalência é definida para esse tipo. Para obter mais informações sobre como definir a igualdade de valores em suas próprias classes e estruturas, consulte Como definir a igualdade de valor para um tipo (Guia de Programação em C#).

Igualdade de valor para valores de ponto flutuante

As comparações de igualdade de valores de ponto flutuante (double e float) são problemáticas devido à imprecisão da aritmética de ponto flutuante em computadores binários. Para obter mais informações, consulte os comentários no tópico Double.

Tópicos relacionados

Nome

Descrição

Como testar a igualdade de referência (identidade) (Guia de Programação em C#)

Descreve como determinar se duas variáveis têm igualdade de referência.

Como definir a igualdade de valor para um tipo (Guia de Programação em C#)

Descreve como fornecer uma definição personalizada de igualdade de valor para um tipo.

Guia de Programação em C#

Fornece links para informações detalhadas sobre importantes recursos da linguagem C# e recursos disponíveis para C# por meio do .NET Framework.

Tipos (Guia de Programação em C#)

Fornece informações sobre o sistema de tipos C# e links para informações adicionais.

Consulte também

Conceitos

Guia de Programação em C#