==与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失败,因为a
为null
,因此无法在空对象上调用方法。
因为我试图尽可能懒惰地编写代码,所以我使用==
,特别是在处理任何对象(或两者)都为空的情况下。 如果我没有,我必须做一个空检查,首先,才能够调用.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.