Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida no Ex. 1 da Aula 3 - Classe Object

Alguem me explica a diferença de Equals para == ?

6 respostas
solução!

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!