Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Às vezes, é necessário comparar dois valores para igualdade. Em alguns casos, você está testando 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, você precisa determinar se duas variáveis se referem ao mesmo objeto subjacente na memória. Esse 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
A 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, 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) = {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}");
}
}
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 ReferenceEquals método para determinar se duas referências se referem ao mesmo objeto.
O conceito de igualdade de referência se aplica apenas aos tipos de referência. 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 dois structs não embalados que apontam para o mesmo local na memória. Além disso, se você usar ReferenceEquals para comparar dois tipos de valor, o resultado sempre será false
, mesmo que os valores contidos nos objetos sejam todos idênticos. Isso ocorre porque cada variável é encaixada 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 valor primitivo, 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 structs 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 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 campo corresponderem.
No entanto, não há nenhum requisito de que a equivalência seja baseada em todos os campos de um tipo. Ele pode ser baseado em um subconjunto. Ao comparar tipos que você não possui, você deve entender especificamente como a equivalência é definida para esse tipo. 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
Comparações de igualdade de valores de ponto flutuante (duplo e flutuante) são problemáticas devido à imprecisão da aritmética de ponto flutuante em computadores binários. Para obter mais informações, consulte as observações no tópico System.Double.
Tópicos relacionados
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 para um tipo. |
tipos de | Fornece informações sobre o sistema de tipos C# e links para informações adicionais. |
Registros | Fornece informações sobre tipos de registro, que testam a igualdade de valor por padrão. |