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

3

我经常想知道两个变量是否指向同一个类的实例。听起来很明显,但是能做到吗?

例如。想象一下你有以下带有名为“IsSameInstanceAs”的运算符的代码。在使用.Net、C#时,是否有任何方法可以根据if语句内部的注释满足“IsSameInstanceAs”运算符的逻辑:

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
        }
    }
}

我相信这是无法实现的,但如果有人知道更好的方法,请帮忙解答。请注意,我不想比较对象实例,我想知道它们是否是同一个实例。

约翰·汤普森

4个回答

2

谢谢。这正是我一直在寻找的。 - John Thompson

0
使用ReferenceEquals方法
if (Object.ReferenceEquals(myInstanceA, myInstanceB))

来自文档:

“确定指定的对象实例是否为同一实例。”


0
通常情况下,当您在对象上使用比较运算符 == 时,它确切地执行这个操作。但是,如果对象的类型实现了比较运算符的重载,则可能不成立,在这种情况下,您可以始终使用object.Reference.Equals(x, y)
因此,对于大多数类型(字符串是一个值得注意的例外),您都可以执行以下操作:
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而不是带有强制转换的==。对我来说,这种方法更清晰地显示了意图。

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)会在objAobjB是同一实例或者同时为null时返回true,否则返回false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接