具有值语义和相等运算符的引用类型

时间:2013-08-20 17:50:47

标签: c#

Link:

  

•如果语义为,则考虑在引用类型上覆盖Equals   该类型基于类型代表某些值的事实。

     

•大多数引用类型都不能重载等于运算符,甚至   如果他们重写等于。但是,如果要实现引用   旨在具有值语义的类型,例如复杂   数字类型,您必须覆盖相等运算符。

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

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

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

d)因此,我们根据什么标准来决定具有值语义的引用类型是否应仅覆盖其Equals方法,还是其equality operator?仅仅基于我们是否愿意使类型不可变?

感谢名单

1 个答案:

答案 0 :(得分:2)

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

  

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

我认为D是这里的核心问题,framework design guidelines似乎表明这归结为绩效:

  

AVOID重写引用类型上的相等运算符   实施将明显慢于参考   平等。

Eric Lippert对此here有一些有趣的话要说。我最喜欢的是:

  

答案很长,整个事情很奇怪,而且都没有效果   理想情况下应该如此。

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