==或.Equals()

Dan*_*Dan 59 c#

为什么用一个而不是另一个?

Joh*_*kin 58

==是身份测试.如果被测试的两个对象实际上是同一个对象,它将返回true.Equals()执行相等测试,如果两个对象认为自己相等,则返回true.

身份测试更快,因此您可以在不需要更昂贵的相等测试时使用它.例如,比较null空字符串或空字符串.

可以重载这些中的任何一个来提供不同的行为 - 比如 - 的身份测试Equals()- 但是为了任何人阅读你的代码,请不要.


如下所示:某些类型喜欢StringDateTime==操作符提供重载,使其具有相等的语义.因此,确切的行为将取决于您要比较的对象的类型.


也可以看看:

  • 实际上,如果你也覆盖了operator ==,FxCop强制你覆盖Equals,因为它们应该基本相同,与ReferenceEquals相反. (2认同)
  • 你怎么能说永远不要改写Equals?如果你的对象是Equal但是在应用程序的不同部分创建(比如从db中获取两次相同的行),你可能会说它们是相同的.主要的是Equals应该对应于对象的身份 (2认同)
  • == 以与任何其他运算符相同的方式重载。至于重载 .Equals(),如果您需要某种基于值而非引用的值相等性度量,则应该这样做。并且您应该重载 == if 不应该通过引用进行比较(即值类型) (2认同)
  • 因为 String 会覆盖 == 运算符并在使用 == 时调用 String.Equals(a, b)。因此 s == r 和 s.Equals(r) 对 String 执行完全相同的操作。[查看源代码](http://referencesource.microsoft.com/#mscorlib/system/string.cs,673) (2认同)

Fly*_*wat 20

@John Millikin:

如下所示:某些值类型(如DateTime为==运算符>提供了重载,赋予它相等的语义.因此,确切的行为将取决于您要比较的>对象的类型.

详细说明:

DateTime作为结构实现.所有结构都是System.ValueType的子代.

由于System.ValueType的子项存在于堆栈中,因此没有指向堆的引用指针,因此无法进行引用检查,您必须仅按值比较对象.

System.ValueType重写.Equals()和==以使用基于反射的相等性检查,它使用反射来比较每个字段的值.

因为反射有点慢,如果你实现自己的结构,重要的是覆盖.Equals()并添加你自己的值检查代码,因为这会更快.不要只调用base.Equals();


Joh*_*udy 15

其他人几乎都有你,但我还有一个建议.每隔一段时间,你就会得到一个对他的生命(以及他所爱的人)发誓的人.Equals更有效/更好/最佳实践或其他一些教条.我不能说效率(好吧,好吧,在某些情况下我可以),但我可以谈到一个大问题:.Equals要求一个物体存在.(听起来很愚蠢,但却让人们失望.)

您不能执行以下操作:

StringBuilder sb = null;
if (sb.Equals(null))
{
    // whatever
}
Run Code Online (Sandbox Code Playgroud)

对我来说,也许是大多数人来说,你会得到一个NullReferenceException.然而,支持者.Equals忘记了那个小事实.当他们看到NullRefs开始弹出时,有些甚至被"抛弃"(抱歉,无法抗拒).

(在DailyWTF发布之前的几年,我确实与那些强制要求所有相等性检查.Equals的人合作==.甚至证明他的不准确也没有帮助.我们只是确实打破了他所有的其他规则,以便没有参考从方法和属性永远都是空的,并且它最终得到了解决.)


Jos*_*ald 6

==通常是"身份"等于意思是"对象a实际上是与对象b在内存中完全相同的对象".

equals()表示对象在逻辑上相等(例如,从业务角度来看).因此,如果要比较用户定义类的实例,如果希望Hashtable之类的东西能够正常工作,通常需要使用和定义equals().

如果你有一个具有属性"Name"和"Address"的谚语Person类,并且你想使用这个Person作为包含更多关于它们的信息的Hashtable的键,你需要实现equals()(和hash)以便你可以创建Person的实例并将其用作Hashtable的键以获取信息.

使用==独自一人,你的新实例将不会是相同的.


Jas*_*son 5

根据MSDN

在 C# 中,有两种不同类型的相等:引用相等(也称为标识)和值相等。值相等是通常理解的相等含义:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有相等的值。引用相等意味着没有两个对象可以比较。相反,有两个对象引用,并且它们都引用同一个对象。

...

默认情况下,运算符 == 通过确定两个引用是否指示同一对象来测试引用相等性。