Compartilhar via


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

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

Igualdade de referência

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

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

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 duas referências referenciam o mesmo objeto.

O conceito de igualdade de referência se aplica apenas a tipos de referência. Objetos de tipo de valor não podem ter 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 é gerada. Portanto, não é possível ter dois structs desconvertidos que referenciam o mesmo local na memória. Além disso, se ReferenceEquals for usado para comparar dois tipos de valor, o resultado sempre será false, mesmo se os valores contidos nos objetos forem idênticos. Isso ocorre porque cada variável é convertido em uma instância de objeto separada. Para obter mais informações, consulte Como testar a igualdade de referência (Identidade).

Igualdade de valor

Igualdade de valor significa que dois objetos contêm o mesmo valor ou valores. Para tipos de valor primitivos, como int ou bool, os testes de igualdade de valor 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, o teste de igualdade de valor é mais complexo, pois é necessário entender como o tipo o define. Para classes e structs que têm vários campos ou propriedades, a igualdade de valor geralmente é definida para determinar que todos os campos ou propriedades tenham o mesmo valor. Por exemplo, dois objetos Point podem ser definidos para serem equivalentes se pointA.X for igual a pointB.X e pointA.Y for igual a pointB.Y. Para registros, a igualdade de valor significa que duas variáveis de um tipo de registro são iguais se os tipos corresponderem e todos os valores de propriedade e de campo corresponderem.

No entanto, não há nenhuma exigência de que a equivalência seja baseada em todos os campos em um tipo. Ela pode ser baseada em um subconjunto. Ao comparar tipos que não são de sua propriedade, certifique-se de que a forma como a equivalência é definida especificamente para esse tipo foi entendida. Para obter mais informações sobre como definir a igualdade de valor em suas próprias classes e structs, consulte Como definir a igualdade de valor para um tipo.

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 System.Double.

Título Descrição
Como testar a igualdade de referência (Identidade) Descreve como determinar se duas variáveis têm igualdade de referência.
Como definir a igualdade de valor para um tipo Descreve como fornecer uma definição personalizada de igualdade de valor a um tipo.
Types Fornece informações sobre o sistema de tipos do C# e links para mais informações.
Registros Fornece informações sobre tipos de registro que testam a igualdade de valor por padrão.