即使我知道如何/何时重载operator ==,为什么我应该这样做?

Gur*_*pof 7 c#

假设我正在设计一个供其他人使用的对象集合,并假设我已阅读并理解(呵呵?)关于operator ==和Equals()之间差异的大多数线程,为什么我应该实现operator ==?

这个线程中窃取一个例子,使用它可能非常容易出错:

object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
(x == y); // evaluates to FALSE
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
(x == y); // evaluates to TRUE
Run Code Online (Sandbox Code Playgroud)

那么,我可以告诉我的用户只使用Equals()和ReferenceEquals(),那就是它吗?我在那里错过了什么?

  • 是否有可能使用==的标准代码库的部分并且没有办法绕过它?

  • 在某些重要案例中,==表现更好吗?(好吧,好吧,Equals是虚拟的,所以它总是会慢一点,但我看不出任何实际上成为瓶颈的用例)

  • 别的什么?

Jon*_*eet 8

可以告诉您的用户只是使用Equals...但我发现它非常方便各种类型(包括String)过载==.是的,您需要了解重载解析的工作方式,但对于大多数有经验的开发人员,我怀疑大多数时候这不是问题,而是:

if (Equals(x, y))
Run Code Online (Sandbox Code Playgroud)

最终看起来更糟糕

if (x == y)
Run Code Online (Sandbox Code Playgroud)

在我看来.请注意,这些都是不同的

if (x.Equals(y))
Run Code Online (Sandbox Code Playgroud)

如果x是空的话会爆炸,当然......

如果你不想超载,==那么就不会有任何事情会失败 - 你可能会让心怀不满的用户感到沮丧.