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

Dúvida no Ex. 3 da Aula 6 - Lidando com conjuntos

Olá!

Fiquei com uma dúvida na execução do exercício abaixo:

"Na classe Conta, sobrescrevemos o método Equals() para sempre retornar falso:

class Conta
{
  public override bool Equals(Object o)
  {
    return false;
  }
}

Em seguida, adicionamos 2 Contas em um conjunto:

var conjunto = new HashSet<Conta>();
var c1 = new Conta();

conjunto.Add(c1);
conjunto.Add(c1);

MessageBox.Show(conjunto.Count.ToString());

Qual a saída desse programa?

( ) 1

( ) 0

( ) Erro em tempo de execução

( ) O código não compila

( ) 2"*

Optei pela primeira opção (1) porque o método sobrescrito foi o Equals() e não o GetHashCode(), conforme explicação:

"A categoria é dada a partir do método GetHashCode(). Todo objeto tem esse método, já que ele é descrito na classe Object, pai de todas as classes no C#."

Mas a resposta certa é a última (2). Por quê?

5 respostas
solução!

Olá Marcelo!

A explicação do exercício diz por que:

"O conjunto, ao encontrar a "categoria", pergunta para cada objeto que está ali se ele é igual ao que estamos inserindo. Para saber se é igual, ele faz uso do método Equals(). Se o método Equals() estiver mal implementado, confundiremos o conjunto! Neste caso, ele dirá que o objeto não é igual a ele mesmo, permitindo incluir novamente o mesmo objeto: o programa imprimirá 2.

Portanto, para que o Set faça seu trabalho corretamente, os métodos Equals() e GetHashCode() devem estar bem implementados!"

Você não entendeu alguma coisa dessa explicação?

Obrigado pela explicação, Gabriel!

Entendo que o método usado pelo HashSet para comparar os objetos é o Equals() e não o GetHashCode(), mas o vídeo e a explicação dizem que é o GetHashCode(). Creio que foi isso que gerou a confusão. Eu também fiquei confuso.

Sugiro uma alteração no conteúdo.

Sugiro uma alteração no exercício, visto que também fiquei confuso sobre a utilização do GetHashCode(), afinal, não tem na aula falando como é implementado esse método, somente aparece na resposta, esse exercício fica impossível de ser respondido da forma correta.

Então para que o GetHashCode funcione corretamente, é necessário implementar a validação no método Equals? Pelo material, havia entendido que o GetHashCode fazia a categorização automaticamente.