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. |
Fornece links para informações detalhadas sobre importantes recursos da linguagem C# e recursos disponíveis para C# por meio do .NET Framework. |
|
Fornece informações sobre o sistema de tipos C# e links para informações adicionais. |