如果不对引用类型做任何特别的事情,Equals()
就意味着引用相等(即相同的对象)。如果我选择覆盖Equals()
引用类型,是否总是意味着两个对象的值是等价的?
考虑这个可变Person
类:
class Person
{
readonly int Id;
string FirstName { get; set; }
string LastName { get; set; }
string Address { get; set; }
// ...
}
代表完全相同的人的两个对象将始终具有相同的Id
,但其他字段可能会随着时间的推移而不同(即在地址更改之前/之后)。
对于这个对象,Equals 可以定义为不同的东西:
- 值相等:所有字段都相等(代表同一个人但地址不同的两个对象将返回 false)
- 身份平等:
Ids
相等(代表同一个人但地址不同的两个对象将返回 true) - 参考平等:即不实施平等。
问题:哪一个(如果有的话)更适合这个课程?(或者问题应该是,“这个类的大多数客户期望 Equals() 表现如何?”)
笔记:
Hashset
使用 Value Equality 使得在or中使用此类变得更加困难Dictionary
使用 Identity Equality 使 Equals 和运算符之间的关系变得
=
奇怪(即在检查两个 Person 对象(p1 和 p2)后返回 trueEquals()
,您可能仍希望更新您的引用以指向“较新”的 Person 对象,因为它是价值不相等)。例如,下面的代码读起来很奇怪——看起来它什么也没做,但它实际上是删除 p1 并添加 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);
相关问题: