= .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另有说明,我认为它们是有意引起混乱的。