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: