首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReferenceEquals(变量,null)是否与变量== null相同?

ReferenceEquals(变量,null)是否与变量== null相同?
EN

Stack Overflow用户
提问于 2012-10-16 23:29:50
回答 3查看 198关注 0票数 3

基本上就是标题。我在我正在编写的代码中看到了很多前者,我想知道为什么他们不使用后者。这两者之间有什么区别吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-16 23:33:35

直接从the documentation

方法和相等运算符不同,ReferenceEquals方法不能被重写。因此,如果要测试两个对象引用是否相等,并且不确定Equals方法的实现,可以调用ReferenceEquals方法。但是,请注意,如果objA和objB是值类型,则在将它们传递给ReferenceEquals方法之前对它们进行装箱。

票数 2
EN

Stack Overflow用户

发布于 2012-10-16 23:32:41

不怎么有意思。你可以重载operator ==,所以你基本上可以让它返回,比如false always。这个运算符的推荐用法是表示值相等,因此(对于正确实现的运算符)如果对象在语义上是null,那么基本上检查null可能会返回true。

有关更多详细信息和一些历史概述,请参阅this article

另一个区别是,对于值类型,ReferenceEquals没有多大意义:例如,在任何正常情况下,int 0的任何两个“实例”都必须被认为是相同的。(对于纯粹主义者:我放了引号,因为严格地说,我们不能谈论值类型的实例。)

票数 2
EN

Stack Overflow用户

发布于 2012-10-16 23:41:24

ReferenceEquals()的主要好处是意图更清晰,您可以尝试确定两个引用是否相等,而不是确定引用的对象的内容是否相等。

它通过检查转换为object的两个引用之间的operator ==相等性(因为参数都是object)来做到这一点,这消除了可能会混淆问题的任何子类operator ==重载(如string的)。

所以从本质上讲,这是:

代码语言:javascript
复制
if (ReferenceEquals(x, y))

与以下内容相同:

代码语言:javascript
复制
if (((object)x) == ((object)y))

尽管前者更容易阅读。

当然,有时候它会派上用场,特别是当你自己重载operator ==时,避免无限递归:

代码语言:javascript
复制
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.
    }
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12918197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档