【问题标题】:In .Net How Do You Check Whether Two Identifiers Point at Same INSTANCE of An Object?在 .Net 中如何检查两个标识符是否指向对象的同一实例?
【发布时间】:2012-10-04 09:01:25
【问题描述】:

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

例如。假设您有以下代码,其中包含一个名为“IsSameInstanceAs”的运算符。有没有什么方法可以实现“IsSameInstanceAs”运算符的逻辑,如使用 .Net、C# 的 if 语句中的 cmets 所述:-

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

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

约翰·汤普森

【问题讨论】:

    标签: .net object compare instance


    【解决方案1】:

    Object.ReferenceEquals是相关方法。

    判断指定的Object实例是否相同 实例。

    【讨论】:

    • 谢谢。这就是我一直在寻找的。​​span>
    【解决方案2】:

    使用ReferenceEquals method

    if (Object.ReferenceEquals(myInstanceA, myInstanceB))
    

    来自文档:

    "判断指定的Object实例是否相同 实例。”

    【讨论】:

      【解决方案3】:

      来自 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 如果objAobjB 相同或两者都是null;否则,false

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-20
          • 2022-08-07
          • 2023-04-03
          • 2021-08-06
          • 2011-03-09
          • 2019-11-25
          • 1970-01-01
          • 2012-11-08
          相关资源
          最近更新 更多