在.Net中如何检查两个标识符是否指向对象的相同实例?

时间:2012-10-04 09:01:26

标签: .net object compare instance

我一直想知道两个变量是否指向同一个类的实例。听起来很明显,但可以吗?

例如。想象一下,你有一个名为“IsSameInstanceAs”的运算符的代码如下。是否有任何方法可以实现“IsSameInstanceAs”运算符的逻辑,如使用.Net,C#在if语句中的注释中所述: -

public class MyClass
{
    public String MyString;

    public static void TestForSameInstance()
    {
        MyClass myInstanceA = new MyClass();
        MyClass myInstanceB = myInstanceA;
        MyClass myInstanceC = new MyClass();

        myInstanceA.MyString = "A String";
        myInstanceC.MyString = myInstanceA.MyString;

        if (myInstanceA IsSameInstanceAs myInstanceB)
        {
            // These are the same instance so they will match and this if is true
        }

        if (myInstanceA IsSameInstanceAs myInstanceC)
        {
            // These are not the same instance so they will not match and this if is false
        }
    }
}

我相信这不可能做到,但如果有人知道更好,请帮助。请记住,我不想比较对象实例,我想知道它们是否是同一个实例。

John Thompson

4 个答案:

答案 0 :(得分:2)

Object.ReferenceEquals是相关方法。

  

确定指定的Object实例是否相同   实例

答案 1 :(得分:0)

使用ReferenceEquals method

if (Object.ReferenceEquals(myInstanceA, myInstanceB))

来自文档:

  

“确定指定的Object实例是否相同   实例“。

答案 2 :(得分:0)

通常,当您在对象上使用比较==运算符时,它就是它的功能 但是,如果对象的类型实现了比较运算符的oveerload,则可能不适用,在这种情况下,您始终可以使用object.Reference.Equals(x,y)

所以大多数类型几乎都来自BCL(字符串是一个值得注意的例外)

你可以做到

x == y; //reference comparison for most reference types
object.ReferenceEquals(x,y); //works in all cases
x.Equals(y); //reference comparison for most reference types

第一个和最后一个不同之处在于,在第一个编译时类型中,重要的是在后者中它是运行时类型。即使编译时和运行时类型相同,它们也无法保证它们会产生相同的结果(它们应该只有良好的方式强制执行此操作)

因为它是第一个例子中表达式的编译时类型,所以重要的是你可以将它重写为

(object)x == (object)y; //always a reference comparison for reference types

我个人使用object.ReferenceEquals而不是== with casts。对我来说,这个方法更明确地表明了意图。

答案 3 :(得分:0)

来自MSDN:
以下示例使用ReferenceEquals确定两个对象是否是同一个实例。

class MyClass {

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

      Console.WriteLine(Object.ReferenceEquals(o, p));
      p = q;
      Console.WriteLine(Object.ReferenceEquals(p, q));
      Console.WriteLine(Object.ReferenceEquals(o, p));
   }
}

这将产生以下输出:

True
True
False
如果ReferenceEquals(Object objA, Object objB)true的实例相同,或者两者都是objA

objB将返回null;否则,false