Alguem me explica a diferença de Equals para == ?
Alguem me explica a diferença de Equals para == ?
Oi Arthur, tudo bem?
A implementação do método Equals que existe na classe Object, faz a mesma comparação que o operador == faz quando comparamos referencias para objetos: verifica se as variáveis comparadas referenciam o mesmo objeto na memória.
Vamos tomar como exemplo essa classe Cliente
:
class Cliente
{
public string Nome{ get; set; }
}
Vamos fazer alguns testes:
Cliente c1 = new Cliente() { Nome = "Lucas" };
Cliente c2 = new Cliente() { Nome = "Lucas" };
MessageBox.Show("São iguais? " + (c1 == c2)); // False. Referenciam objetos diferentes
MessageBox.Show("São iguais? " + c1.Equals(c2)); // False. Referenciam objetos diferentes
Quando não sobrescrevemos o método Equals, ele simplesmente compara a igualdade da mesma forma que o ==. Quando queremos mudar o nosso critério de comparação, podemos sobrescrever o Equals e refletir o nosso próprio conceito de igualdade.
Imagine que agora queremos que clientes que possuam o mesmo nome sejam considerados iguais. Podemos fazer o seguinte:
class Cliente
{
public string Nome{ get; set; }
// sobrescrevendo o Equals
public override bool Equals(object obj)
{
Cliente outroCliente = (Cliente) obj;
return this.Nome == outroCliente.Nome;
}
}
Agora quando compararmos utilizando o Equals não será mais levado em consideração se temos referencias para o mesmo objeto, mas se os nomes dos Clientes comparados são iguais:
Cliente c1 = new Cliente() { Nome = "Lucas" };
Cliente c2 = new Cliente() { Nome = "Lucas" };
Cliente c3 = new Cliente() { Nome = "Wanderson" };
MessageBox.Show("São iguais? " + (c1 == c2)); // False. Referenciam objetos diferentes
MessageBox.Show("São iguais? " + c1.Equals(c2)); // True. Alteramos nosso critério de comparação
MessageBox.Show("São iguais? " + c1.Equals(c3)); // False. Os nomes são diferentes
Faz sentido?
Abraço.
Acho que entendi, no caso == compara se os objetos sao iguais, e o equals compara se o conteudo sao iguais?! Obrigado
Isso mesmo Arthur. Mas acontece o seguinte, para que se possa comparar o conteúdo, você precisa sobrescrever o método Equals. Caso você não sobrescreva, o comportamento padrão do Equals, é comparar da mesma forma que o ==.
Faz sentido?
Entendi, nesse caso vc deu um return na propriedade em que quis comparar, no caso a propriedade nome do cliente, no caso se eu quiser comparar mais de uma propriedade o que passo para o return?
Opa Arthur. O código pode ser tão complexo quanto se queira, desde que você retorne um "true" ou "false" no fim das contas.
Você pode combinar as propriedades utilizando operadores lógicos, como o &&, por exemplo:
class Cliente
{
public string Nome { get; set; }
public int Idade { get; set; }
public override bool Equals(object obj)
{
Cliente outroCliente = (Cliente) obj;
return this.Nome.Equals(outroCliente.Nome) && this.Idade.Equals(outroCliente.Idade);
}
}
Quando se tem muitas propriedades, pode ficar pouco legível ficar utilizando o &&, então você pode fazer um estratégia utilizando ifs:
class Cliente
{
public string Nome { get; set; }
public int Idade { get; set; }
public override bool Equals(object obj)
{
Cliente outroCliente = (Cliente) obj;
if (!(this.Nome.Equals(outroCliente.Nome)))
{
return false;
}
if (!(this.Idade.Equals(outroCliente.Idade)))
{
return false;
}
return true;
}
}
O código acima faz a mesma coisa: caso uma das propriedades que você deseja que seja igual, não seja, ele já retorna falso e as referências objetos não são considerados iguais.
Perceba que a negação, faz com que fique mais ou menos assim:
"Se o nome do cliente atual não for igual ao nome do cliente que quero comparar, retorne falso".
O mesmo vale pra idade, e valeria pra outras propriedades caso houvesse.
Faz sentido, ou compliquei mais?
Atualização: É interessante você chamar o Equals nas propriedades que está comparando também. Atualizei o código pra mostrar isso.
Entendii, valeuuu vc eh o cara!