•如果语义为,则考虑在引用类型上覆盖Equals 该类型基于类型代表某些值的事实。
•大多数引用类型都不能重载等于运算符,甚至 如果他们重写等于。但是,如果要实现引用 旨在具有值语义的类型,例如复杂 数字类型,您必须覆盖相等运算符。
a)据我了解,对于可互换的引用类型的不同实例,我们应该覆盖Equals
方法和equality operator
,并使类型不可变 ?
b)具有值语义的引用类型是否表明该类型的不同实例(代表相同的值)应该是可以互换的?
c)但是根据上面的引用,某些具有值语义的引用类型应该只覆盖Equals
方法,但不能覆盖equality operator
。我们如何声称这些类型具有值语义,因为该类型的实例显然不可互换?
d)因此,我们根据什么标准来决定具有值语义的引用类型是否应仅覆盖其Equals
方法,还是其equality operator
?仅仅基于我们是否愿意使类型不可变?
感谢名单
答案 0 :(得分:2)
关于A点,是的,类型应该是不可变的。来自MSDN:
您不应该在可变引用类型上覆盖Equals。
我认为D是这里的核心问题,framework design guidelines似乎表明这归结为绩效:
AVOID重写引用类型上的相等运算符 实施将明显慢于参考 平等。
Eric Lippert对此here有一些有趣的话要说。我最喜欢的是:
答案很长,整个事情很奇怪,而且都没有效果 理想情况下应该如此。
就个人而言,这让我松了一口气,因为我一直认为“==”在功能上是Equals()的可读简写(即使我知道它不是)。