1

关联:

• 如果类型的语义基​​于该类型表示某些值这一事实,请考虑在引用类型上覆盖 Equals。

• 大多数引用类型不得重载相等运算符,即使它们覆盖了 Equals。但是,如果您正在实现旨在具有值语义的引用类型,例如复数类型,则必须覆盖相等运算符。

a) 据我了解,要使引用类型的不同实例可互换,我们应该同时覆盖Equals方法和 the equality operator,并使类型不可变

b) 具有值语义的引用类型是否表明该类型的不同实例(表示相同值)应该是可互换的?

c) 但是根据上面的引用,某些具有值语义的引用类型应该只Equals覆盖方法,而不是equality operator. 我们怎么能声称这些类型具有值语义,因为该类型的实例显然不可互换?

d) 那么我们基于什么标准来决定一个具有值语义的引用类型是否应该只Equals覆盖它的方法或者它的equality operator?仅仅基于我们是否愿意使类型不可变?

谢谢

4

1 回答 1

2

关于 A 点,是的,类型应该是不可变的。来自MSDN

您不应该在可变引用类型上覆盖 Equals。

我认为 D 是这里的核心问题,框架设计指南似乎表明这归结为性能:

如果实现明显慢于引用相等,则避免在引用类型上重载相等运算符。

Eric Lippert 在这里有一些有趣的事情要说。我最喜欢的一句话是:

长答案是,整个事情都很奇怪,而且都没有按照理想的方式工作。

就个人而言,这让我松了一口气,因为我一直认为“==”在功能上是 Equals() 的可读简写(尽管我知道它不是)。

于 2013-08-20T17:54:58.760 回答