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

本文关键字:运算符 引用类型 语义 | 更新日期: 2023-09-27 18:28:19

链接:

•如果的语义类型基于这样一个事实,即该类型表示一些值。

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

a) 据我所知,为了使引用类型的不同实例可互换,我们应该重写Equals方法和equality operator,并使类型不可变

b) 具有值语义的引用类型难道不意味着该类型的不同实例(表示相同值)应该是可互换的吗?

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

d) 那么,我们根据什么标准来决定一个具有值语义的引用类型应该只重写其Equals方法,还是同时重写其equality operator?仅仅基于我们是否愿意使类型不可变?

乙醇

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

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

不应重写可变引用类型上的Equals。

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

如果实施将明显慢于参考平等

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

长期的答案是,整件事很奇怪,两者都不起作用

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