ReferenceEquals如何理解引用属于同一个对象?

时间:2010-08-03 12:48:47

标签: c# .net reference

我只是.NET中一些类和方法的好奇背景所以我只是想知道ReferenceEquals方法如何理解2个引用是否属于同一个对象?

5 个答案:

答案 0 :(得分:4)

因为“同一个对象”意味着“内存中的相同位置”,操作可以简单地检查引用的“地址”值。

Not that you can easily get at that value,但是你永远不需要。

答案 1 :(得分:2)

引用基本上是一个32位整数,指向存储对象的堆中的位置,因此ReferenceEquals可以简单地比较两个整数值并检查它们是否相同。

请注意值类型,ReferenceEqual总是会失败! ValueType覆盖虚拟Object.Equals方法,以比较派生类型中的所有成员变量而不是引用。

在不知道成员变量的运行时名称和类型的情况下,ValueType.Equals的默认实现依赖于反射和反射的使用,我们都知道,它很慢。作为一般的经验法则,建议您在创建自定义值类型时始终覆盖ValueType.Equals方法,并且您应该强烈考虑在您使用时重载==和!=运算符!

答案 2 :(得分:1)

因为它们具有相同的价值。就像非托管应用程序中的两个指针指向相同的对象一样,如果它们具有相同的值。

答案 3 :(得分:1)

ReferenceEqulas检查内存位置是否相同

 class MyClass {

       static void Main() {
          object o = null;
          object p = null;
          object q = new Object();

          //Here o and p not referring to any location.so result true
          Console.WriteLine(Object.ReferenceEquals(o, p));
          p = q; // here p's memory location is mapping to q.So both referring to same memory    location. so result is true.
          Console.WriteLine(Object.ReferenceEquals(p, q));
            //Here the p and o are in different memory location so the result is false
          Console.WriteLine(Object.ReferenceEquals(o, p));
       }
    }

答案 4 :(得分:0)

我怀疑它正在检查引用是否指向内存中的同一个对象,即两个对象都引用了相同的地址。