3

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

例如。假设您有以下代码,其中包含一个名为“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
        }
    }
}

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

约翰汤普森

4

4 回答 4

2

Object.ReferenceEquals是相关的方法。

确定指定的 Object 实例是否为同一个实例。

于 2012-10-04T09:02:38.847 回答
0

使用ReferenceEquals方法

if (Object.ReferenceEquals(myInstanceA, myInstanceB))

从文档中:

“确定指定的 Object 实例是否为同一个实例。”

于 2012-10-04T09:03:48.327 回答
0

通常,当您==在对象上使用比较运算符时,这正是它所做的但是如果对象的类型实现了比较运算符的过载,这可能不成立,在这种情况下您总是可以使用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 而不是 == 与演员。对我来说,该方法更清楚地表明了意图。

于 2012-10-04T09:04:01.697 回答
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

于 2012-10-04T09:04:13.590 回答