具有值语义和相等运算符的引用类型
本文关键字:运算符 引用类型 语义 | 更新日期: 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()的一个可读缩写(尽管我知道它不是)。