c# - 即使我知道如何/何时重载 operator==,我为什么要这样做?

标签 c#

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

this thread 中窃取示例, 使用它很容易出错:

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

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

  • 是否有使用 == 的标准代码库片段,并且没有办法绕过它?

  • 在某些重要 情况下,== 性能是否好很多? (好吧,好吧,Equals 是一个虚拟的,所以它会一直慢一点,但我看不到任何实际成为瓶颈的用例)

  • 还有别的吗?

最佳答案

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

if (Equals(x, y))

最终看起来比

更难看
if (x == y)

在我看来。请注意,这些都不同于

if (x.Equals(y))

当然,如果 x 为 null,它会爆炸......

如果您不希望重载 == 那么它不会像任何事情都会失败 - 您可能会得到不满的用户。

关于c# - 即使我知道如何/何时重载 operator==,我为什么要这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016843/

相关文章:

c# - 最好的 ViewModel 命名约定是什么?

c# - 使用 XPath 选择 XMLNode

c# - 如何将 TextBox 值传递给 MVC razor 中的 URL.Action?

c# - Elasticsearch 结果,范围运算符返回错误结果

c# - 如何确定某个位置的 .NET 应用程序实例是否正在运行?

c# - 在编译时不知道 DLL 时调用 PInvoke?

c# - 在一组中使用 visual studio 2008 和 2005

c# - 如何使用 DataAnnotation 进行自定义验证并从配置 appsettings.json 中获取值?

c# - 在 C#/.Net 中使用异步套接字安全地传输二进制数据

c# - 为什么我不能在 C# 中的 char 数组上使用 .ToString() 方法?