Deve uma substituição de iguais em um tipo de referência sempre significa igualdade de valor?

Sem fazer nada de especial para um tipo de referência,Equals() significaria igualdade de referência (ou seja, mesmo objeto). Se eu optar por substituirEquals() para um tipo de referência, deve sempre significar que os valores dos dois objetos são equivalentes?

Considere este mutávelPerson classe:

class Person
{
    readonly int Id;

    string FirstName { get; set; }
    string LastName { get; set; }
    string Address { get; set; }
    // ...
}

Dois objetos que representam exatamente a mesma pessoa sempre terão o mesmoId, mas os outros campos podem ser diferentes ao longo do tempo (ou seja, antes / depois de uma alteração de endereço).

Para este objeto, Equals pode ser definido para significar coisas diferentes:

Igualdade de valores: todos os campos são iguais (dois objetos representando a mesma pessoa, mas com endereços diferentes, retornariam falso)Igualdade de Identidade: oIds são iguais (dois objetos representando a mesma pessoa mas com endereços diferentes retornariam true)Igualdade de referência: isto é, não implemente Equals.

Questão: Qual (se houver) destes é preferível para esta classe? (Ou talvez a pergunta seja: "como a maioria dos clientes dessa classe espera que o Equals () se comporte?")

Notas:

Usar o Value Equality torna mais difícil usar essa classe em umHashset ouDictionary

Usando Identity Equality faz a relação entre Equals e o= operador estranho (ou seja, depois de uma verificação de dois objetos Person (p1 e p2) retorna true paraEquals(), você ainda pode querer atualizar sua referência para apontar para o objeto Person "mais novo", já que não é um valor equivalente. Por exemplo, o código a seguir lê estranho - parece que não faz nada, mas na verdade está removendo p1 e adicionando p2:

HashSet<Person> people = new HashSet<Person>();
people.Add(p1);
// ... p2 is an new object that has the same Id as p1 but different Address
people.Remove(p2);
people.Add(p2);

Perguntas relacionadas:

Por que a Microsoft recomenda ignorar a implementação do operador de igualdade para tipos de referência?C # diferença entre == e igual ()Quando uma substituição de classe .NET é igual a ()? Quando não deveria?Simplifique a substituição de Equals (), GetHashCode () em C # para Melhor Manutenção

questionAnswers(3)

yourAnswerToTheQuestion