C# - Diferenca entre Equals e ==


 Hoje veremos a diferença entre o método Equals e o operador de igualdade (==).

Antes de partir para a definição vamos recordar um conceito fundamental :

Os tipos de dados no .Net Framework podem ser classificados de acordo com o fato de uma variável de um tipo específico armazenar seus próprios dados ou um ponteiro para os dados. Se a variável armazena seus próprios dados, é um tipo de valor e se ela contém um ponteiro para dados em outro lugar na memória, é um tipo de referência. Além disso você pode atribuir um tipo de referência ou um tipo de valor a uma variável do tipo de dados Object.

Agora vamos definir Equals e o operador de igualdade. (conforme a MSDN)

1- Equals

O método Equals determina se o objeto especificado é igual a ao objeto atual.

Sintaxe :

public virtual bool Equals(object obj)

Onde obj é o objeto a ser comparado com o objeto atual

Valor retornado:  true se o objeto especificado for igual a objeto atual, caso contrário retorna false.

O tipo de comparação entre a instância atual e o obj parâmetro depende se a instância atual é um (1)tipo de referência ou um (2)tipo de valor.

(1) - Se a instância atual é um tipo de referência, o método Equals(Object) testa a igualdade de referência e uma chamada para o método é equivalente a uma chamada para o método ReferenceEquals;

(2) - Se a instância atual é um tipo de valor, o método Equals(Object) testa a igualdade de valor;

 2 - Operador ==

Para tipos de valor predefinidos, o operador de igualdade (==) retornará true se os valores dos seus operandos forem iguais; caso contrário, false.

Para tipos de referência diferentes de string, o == retornará true se seus dois operandos se referirem ao mesmo objeto. Para o tipo string, o operador == compara os valores das cadeias de caracteres.

Comparando tipos por valor

Para valor e por tipo o operador == e o método Equals() funcionam da mesma maneira, ambos comparam dois objetos por valor.

Quando você compara tipos de valor, ou seja, tipos de dados primitivos (int, double etc) usando o operador "==" ou o método "Equals", a comparação é feita sempre com base no conteúdo.

No código abaixo, você pode ver que os dois métodos de comparação retornam ambos o mesmo valor : "true".

Comparando tipos por referência

Agora, quando você compara objetos, eles são comparados com base na referência (ponteiro da memória interna).

Abaixo temos a comparação entre oPessoa1 e oPessoa2 usando o operador "==" e o método "Equals",e , ambos vão retornar false.

Assim, embora ambos objetos tenham um nome de propriedade igual a "Macoratti", eles ainda não serão iguais.

Porque a comparação é baseada na referência da memória interna, que é diferente para "oPessoa1 " e "oPessoa2".

Mas existe uma diferença no tratamento para objetos por referência.

No exemplo abaixo temos que o operador ==  retorna false pois ambas as referências apontam para objetos diferentes, já o método Equals() compara os objetos por valor e retorna true pois as referências dos objetos são equivalentes.

Então quando usar o operador == e quando usar o método Equals() ?

O operador "==" é apenas um operador C#, enquanto que "Equals" é um método polimórfico.

Em outras palavras, "==" é um recurso de linguagem, enquanto "Equals" é um recurso de programação orientada a objetos que segue o polimorfismo.

Dessa forma a comparação pode se feita com base em duas abordagens:

1- comparação baseada em conteúdo e referência que é uma comparação técnica baseada no computador
2- comparação baseada na semântica ou seja o significado real de uma coisa.


Por exemplo, 1 é diferente de 4 (1 <> 4) numericamente falando, mas 1 real vale 4 dólares (atualmente) semanticamente falando.

Com base nisso se você está procurando por uma comparação técnica, então use o operador “==” a maior parte do tempo. Neste cenário o operador “==” é suficiente, já que desenvolvedores fazem principalmente comparações técnicas.

Se você está comparando semanticamente, então você precisa usar a lógica de comparação semântica e neste cenário você precisa usar o método "Equals" para comparar.

E estamos conversados...

"Porque Deus amou o mundo de tal maneira que deu o seu Filho unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna."
João 3:16

Referências:


José Carlos Macoratti