Comparações de igualdade (Guia de Programação em C#)
Por vezes, é necessário comparar dois valores para a igualdade. Em alguns casos, você está testando a igualdade de valores, também conhecida 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 se referem ao mesmo objeto subjacente na memória. Este tipo de igualdade é chamado de igualdade de referência, ou identidade. Este tópico descreve esses dois tipos de igualdade e fornece links para outros tópicos para obter mais informações.
Igualdade de referência
Igualdade de referência significa que duas referências de objeto se referem 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; }
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);
}
}
Neste 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. Por isso, têm uma igualdade de referência. Use o ReferenceEquals método para determinar se duas referências se referem ao mesmo objeto.
O conceito de igualdade de referência aplica-se apenas aos tipos de referência. Os objetos de tipo de valor não podem ter igualdade de referência porque quando uma instância de um tipo de valor é atribuída a uma variável, uma cópia do valor é feita. Portanto, você nunca pode ter duas estruturas unboxed que se referem ao mesmo local na memória. Além disso, se você usar ReferenceEquals para comparar dois tipos de valor, o resultado será false
sempre , mesmo que os valores contidos nos objetos sejam todos idênticos. Isso ocorre porque cada variável é encaixotada em uma instância de objeto separada. Para obter mais informações, consulte Como testar a igualdade de referência (Identidade).
Igualdade de valores
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 de igualdade de valor são simples. Você pode 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 porque requer que você entenda como o tipo o define. Para classes e estruturas que têm vários campos ou propriedades, a igualdade de valor geralmente é definida para significar que todos os campos ou propriedades têm o mesmo valor. Por exemplo, dois Point
objetos podem ser definidos como equivalentes se pointA.X for igual a pointB.X e pointA.Y for igual a pointB.Y. Para registros, 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 campo corresponderem.
No entanto, não é exigido que a equivalência se baseie em todos os campos de um tipo. Pode ser baseado em um subconjunto. Ao comparar tipos que não são de sua propriedade, você deve se certificar de entender especificamente como a equivalência é definida para esse tipo. Para obter mais informações sobre como definir igualdade de valor em suas próprias classes e estruturas, consulte Como definir igualdade de valor para um tipo.
Igualdade de valores para valores de vírgula flutuante
As comparações de igualdade de valores de vírgula flutuante (duplo e flutuante) são problemáticas devido à imprecisão da aritmética de vírgula flutuante em computadores binários. Para obter mais informações, consulte os comentários no tópico System.Double.
Tópicos relacionados
Title | Description |
---|---|
Como testar a igualdade de referência (Identidade) | Descreve como determinar se duas variáveis têm igualdade de referência. |
Como definir igualdade de valor para um tipo | Descreve como fornecer uma definição personalizada de igualdade de valor para um tipo. |
Tipos | Fornece informações sobre o sistema de tipo C# e links para informações adicionais. |
Registos | Fornece informações sobre tipos de registro, que testam a igualdade de valor por padrão. |