基本上就是标题。我在我正在编写的代码中看到了很多前者,我想知道为什么他们不使用后者。这两者之间有什么区别吗?
谢谢。
发布于 2012-10-16 23:33:35
直接从the documentation
与
方法和相等运算符不同,ReferenceEquals方法不能被重写。因此,如果要测试两个对象引用是否相等,并且不确定Equals方法的实现,可以调用ReferenceEquals方法。但是,请注意,如果objA和objB是值类型,则在将它们传递给ReferenceEquals方法之前对它们进行装箱。
发布于 2012-10-16 23:32:41
不怎么有意思。你可以重载operator ==,所以你基本上可以让它返回,比如false always。这个运算符的推荐用法是表示值相等,因此(对于正确实现的运算符)如果对象在语义上是null,那么基本上检查null可能会返回true。
有关更多详细信息和一些历史概述,请参阅this article。
另一个区别是,对于值类型,ReferenceEquals没有多大意义:例如,在任何正常情况下,int 0的任何两个“实例”都必须被认为是相同的。(对于纯粹主义者:我放了引号,因为严格地说,我们不能谈论值类型的实例。)
发布于 2012-10-16 23:41:24
ReferenceEquals()的主要好处是意图更清晰,您可以尝试确定两个引用是否相等,而不是确定引用的对象的内容是否相等。
它通过检查转换为object的两个引用之间的operator ==相等性(因为参数都是object)来做到这一点,这消除了可能会混淆问题的任何子类operator ==重载(如string的)。
所以从本质上讲,这是:
if (ReferenceEquals(x, y))与以下内容相同:
if (((object)x) == ((object)y))尽管前者更容易阅读。
当然,有时候它会派上用场,特别是当你自己重载operator ==时,避免无限递归:
public class Foo
{
public static bool operator ==(Foo first, Foo second)
{
// can't say if (first == second) here or infinite recursion...
if (ReferenceEquals(first, second))
{
// if same object, obviously same...
return true;
}
// etc.
}
}https://stackoverflow.com/questions/12918197
复制相似问题