Back-End

18 out, 2018

C# – Diferenca entre Equals e ==

Publicidade

Hoje veremos as diferenças entre o método Equals e o operador de igualdade (==). Porém, 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 ao objeto atual.

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

  • (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 retornarão false.

Assim, embora ambos objetos tenham um nome de propriedade igual a “Macoratti”, eles ainda não serão iguais, uma vez que 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 “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, 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!