==与Object.Equals(对象)在.NET中

所以,当我是新手的比较新手时,我现在认为这两个东西是句法糖,也就是说使用一个就是个人喜好。 随着时间的推移,我发现这两者不是一回事,即使在默认的实现中(见本文和本文 )。 为了进一步混淆这个问题,每一个都可以被重写/重载,分别具有完全不同的含义。

这是一件好事,有什么区别,什么时候/为什么要用一个在另一个之上?

MSDN对这两件事情都有清晰而坚实的描述。

object.Equals方法

运算符==

可重载操作符

覆盖等于()和运算符==的指导原则

这是一件好事,有什么区别,什么时候/为什么要用一个在另一个之上?

怎么可能是“好”还是“坏”? 一种方法,另一种 – 运营商。 如果引用平等不够,超载,否则保持原样。 对于原始types,他们只是在框外工作。

string x = "hello"; string y = String.Copy(x); string z = "hello"; 

要testingx指向与y相同的对象:

 (object)x == (object)y // false x.ReferenceEquals(y) // false x.ReferenceEquals(z) // true (because x and z are both constants they // will point to the same location in memory) 

要testingx是否具有与y相同的string值:

 x == y // true x == z // true x.Equals(y) // true y == "hello" // true 

请注意,这与Java不同。 在Java中, ==运算符不会被重载,所以Java中常见的错误是:

 y == "hello" // false (y is not the same object as "hello") 

对于Java中的string比较,您需要始终使用.equals()

 y.equals("hello") // true 

鉴于微软目前对等号运算符==!=说法,结论是: == 应该只是Object.Equals()语法糖:

确保Object.Equals和等号运算符具有完全相同的语义

http://msdn.microsoft.com/en-us/library/vstudio/7h9bszxx(v=vs.110).aspx

在事后看来, 它们是明显的 ,而不仅仅是糖,在devise上似乎是一个错误

如果你想确定你正在得到IDENTITY比较(比较引用时),那么改用ReferenceEquals

不幸的是, ==的处理是不一致的,我通常在操作别人的自定义类时避免它,并且根据我想要的含义,使用较不可读的Equals(a, b)ReferenceEquals(a, b)

恕我直言,这将是更好的人不执行==!= 。 只要让.Net默认为Equals! Equals ! Equals ,并酌情实施Equals

如果有人有不同的推理,我想听听。

(是的,这真是令人困惑,因为Java首先存在,并且使用==来表示ReferenceEquals ,但是改变.Net来performance这种方式已经太迟了,而且我们也有微软自己的声明,上面给出)。

我打算发表这个评论,以接受的答案,但我认为这应该考虑当决定采取哪条路线。

dotnetfiddle: https ://dotnetfiddle.net/gESLzO

小提琴代码:

  Object a = null; Object b = new Object(); // Ex 1 Console.WriteLine(a == b); // Ex 2 Console.WriteLine(b == a); // Ex 3 Console.WriteLine(b.Equals(a)); // Ex 4 Console.WriteLine(a.Equals(b)); 

前3个WriteLine示例将工作,但第四个引发exception。 1和2使用== ,这是一个静态方法,不需要任何对象被实例化。

例3因为b被实例化而起作用。

示例4失败,因为anull ,因此无法在空对象上调用方法。

因为我试图尽可能懒惰地编写代码,所以我使用== ,特别是在处理任何对象(或两者)都为空的情况下。 如果我没有,我必须做一个空检查,首先,才能够调用.Equals()

我对两者的用法的理解是这样的:use ==用于概念平等(在上下文中,这两个参数意味着相同的事情吗?)和.Equals具体的相等(这两个参数在实际上是完全相同的对象吗? )。

编辑:凯文谢菲尔德的链接文章做解释值与参考平等的更好的工作…

您可能想要使用.Equals,因为稍后有人可能会来,并为您上课。

两个最常用的types, String和Int32 ,实现了operator ==()和Equals()作为值相等(而不是引用相等)。 我认为可以考虑这两个定义的例子 ,所以我的结论是两者具有相同的含义 。 如果微软另有说法 ,我认为他们有意造成混乱。

运算符==和Equals()都是相同的,而我们正在比较值而不是引用。 两者的输出相同见下面的例子。

  static void Main() { string x = " hello"; string y = " hello"; string z = string.Copy(x); if (x == y) { Console.WriteLine("== Operator"); } if(x.Equals(y)) { Console.WriteLine("Equals() Function Call"); } if (x == z) { Console.WriteLine("== Operator while coping a string to another."); } if (x.Equals(y)) { Console.WriteLine("Equals() Function Call while coping a string to another."); } } 

输出:

  == Operator Equals() Function Call == Operator while coping a string to another. Equals() Function Call while coping a string to another.