3

2つの変数がクラスの同じインスタンスを指しているかどうかを知りたいと思っています。当たり前のように聞こえますが、それは可能ですか?

例えば。「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

4 に答える 4

2

Object.ReferenceEqualsは関連するメソッドです。

指定されたオブジェクトインスタンスが同じインスタンスであるかどうかを判別します。

于 2012-10-04T09:02:38.847 に答える
0

ReferenceEquals次の方法を使用します。

if (Object.ReferenceEquals(myInstanceA, myInstanceB))

ドキュメントから:

「指定されたオブジェクトインスタンスが同じインスタンスであるかどうかを判断します。」

于 2012-10-04T09:03:48.327 に答える
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を使用し、キャストでは==を使用しません。私にとって、この方法は意図をより明確に示しています。

于 2012-10-04T09:04:01.697 に答える
0

MSDNから:
次の例では、ReferenceEqualsを使用して、2つのオブジェクトが同じインスタンスであるかどうかを判別します。

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場合に返されます。それ以外の場合、。objAobjBnullfalse

于 2012-10-04T09:04:13.590 に答える