= .vs .NET中的Object.Equals(object)

时间:2020-03-06 14:31:07  来源:igfitidea点击:

因此,当我是现在的新手的比较新手时,我曾经认为这两件事是彼此的语法糖,也就是说,彼此使用只是一种个人喜好。随着时间的流逝,我发现这两者不是同一件事,即使在默认实现中也是如此(请参阅此内容)。为了进一步混淆此问题,可以分别覆盖/重载每个对象以具有完全不同的含义。

这是件好事吗,有什么区别?何时/为什么要在一个与另一个上使用?

解决方案

我对这两种用法的理解是:使用==表示概念上的相等(在上下文中,这两个参数是否表示同一件事?)和。等于表示具体上的相等(这两个参数实际上是完全相同的对象吗? )。

编辑:凯文·谢菲尔德(Kevin Sheffield)的链接文章在解释价值与参考平等方面做得更好

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

object.Equals方法

运算子==

重载运算符

覆盖Equals()和运算符的准则==

Is this a good thing, what are the
  differences, and when/why should you
  use one over the other?

怎么可能是"好"或者"坏"的事情?一种方法,另一种运算符。如果引用相等还不够,请重载它们,否则保留它们不变。对于原始类型,它们只是开箱即用。

我们可能希望使用。等于以后某人会出现并在我们上课时让他们超负荷。

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

要测试x是否与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)

要测试x是否与y具有相同的字符串值:

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中的字符串比较,我们需要始终使用.equals()

y.equals("hello")  // true

两种最常用的类型,即String和Int32,将operator ==()和Equals()都实现为值相等(而不是引用相等)。我认为可以考虑这两个定义示例,因此我的结论是,两者具有相同的含义。如果Microsoft另有说明,我认为它们是有意引起混乱的。