Object.ReferenceEquals(Object, Object) メソッド


指定した複数の Object インスタンスが同一インスタンスかどうかを判断します。Determines whether the specified Object instances are the same instance.

 static bool ReferenceEquals(System::Object ^ objA, System::Object ^ objB);
public static bool ReferenceEquals (object objA, object objB);
static member ReferenceEquals : obj * obj -> bool
Public Shared Function ReferenceEquals (objA As Object, objB As Object) As Boolean



比較する最初のオブジェクト。The first object to compare.


比較する 2 番目のオブジェクト。The second object to compare.



objAobjB と同一のインスタンスである場合、または両方のインスタンスが null 参照の場合は true。それ以外の場合は falsetrue if objA is the same instance as objB or if both are null; otherwise, false.

次の例では、を使用し ReferenceEquals て、2つのオブジェクトが同じインスタンスであるかどうかを確認します。The following example uses ReferenceEquals to determine if two objects are the same instance.

using namespace System;
int main()
   Object^ o = nullptr;
   Object^ p = nullptr;
   Object^ q = gcnew Object;
   Console::WriteLine( Object::ReferenceEquals( o, p ) );
   p = q;
   Console::WriteLine( Object::ReferenceEquals( p, q ) );
   Console::WriteLine( Object::ReferenceEquals( o, p ) );


This code produces the following output.


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));

// This code produces the following output:
//   True
//   True
//   False
Public Class App
    Public Shared Sub Main() 
        Dim o As Object = Nothing
        Dim p As Object = Nothing
        Dim q As New Object
        Console.WriteLine(Object.ReferenceEquals(o, p))
        p = q
        Console.WriteLine(Object.ReferenceEquals(p, q))
        Console.WriteLine(Object.ReferenceEquals(o, p))
    End Sub 
End Class 
' This code produces the following output:
' True
' True
' False


Equalsメソッドと等値演算子とは異なり、 ReferenceEquals メソッドをオーバーライドすることはできません。Unlike the Equals method and the equality operator, the ReferenceEquals method cannot be overridden. このため、2つのオブジェクト参照が等しいかどうかをテストし、メソッドの実装がわからない場合は、 Equals メソッドを呼び出すことができ ReferenceEquals ます。Because of this, if you want to test two object references for equality and you are unsure about the implementation of the Equals method, you can call the ReferenceEquals method.

ただし、次の2つのシナリオでは、メソッドの戻り値が異常であるよう ReferenceEquals に見えることがあります。However, the return value of the ReferenceEquals method may appear to be anomalous in these two scenarios:

  • 値型を比較する場合。When comparing value types. objAobjB が値型の場合、メソッドに渡される前にボックス化され ReferenceEquals ます。If objA and objB are value types, they are boxed before they are passed to the ReferenceEquals method. これは、 objA との両方が objB 値型の同じインスタンスを表している場合、 ReferenceEquals false 次の例に示すように、メソッドはを返します。This means that if both objA and objB represent the same instance of a value type, the ReferenceEquals method nevertheless returns false, as the following example shows.

    int int1 = 3;
    Console.WriteLine(Object.ReferenceEquals(int1, int1));
    // The example displays the following output:
    //       False
    //       True
    Public Module Example
       Public Sub Main
          Dim int1 As Integer = 3
          Console.WriteLine(Object.ReferenceEquals(int1, int1))
       End Sub
    End Module
    ' The example displays the following output:
    '       False
    '       True

    値型のボックス化の詳細については、「 ボックス化とボックス化解除」を参照してください。For information on boxing value types, see Boxing and Unboxing.

  • 文字列を比較する場合。When comparing strings. objAobjB が文字列の場合、 ReferenceEquals true 文字列がインターンプールされている場合、メソッドはを返します。If objA and objB are strings, the ReferenceEquals method returns true if the string is interned. 値が等しいかどうかのテストは実行されません。It does not perform a test for value equality. 次の例では、 s1 とが等しいのは、 s2 1 つのインターン文字列の2つのインスタンスであるためです。In the following example, s1 and s2 are equal because they are two instances of a single interned string. ただし、 s3s4 は等しくありません。これは、文字列値が同一であっても、その文字列がインターンプールされていないためです。However, s3 and s4 are not equal, because although they have identical string values, that string is not interned.

    String s1 = "String1";
    String s2 = "String1";
    Console.WriteLine("s1 = s2: {0}", Object.ReferenceEquals(s1, s2));
    Console.WriteLine("{0} interned: {1}", s1,
                      String.IsNullOrEmpty(String.IsInterned(s1)) ? "No" : "Yes");
    String suffix = "A";
    String s3 = "String" + suffix;
    String s4 = "String" + suffix;
    Console.WriteLine("s3 = s4: {0}", Object.ReferenceEquals(s3, s4));
    Console.WriteLine("{0} interned: {1}", s3,
                      String.IsNullOrEmpty(String.IsInterned(s3)) ? "No" : "Yes");
    // The example displays the following output:
    //       s1 = s2: True
    //       String1 interned: Yes
    //       s3 = s4: False
    //       StringA interned: No
    Module Example
       Public Sub Main()
          Dim s1 As String = "String1"
          Dim s2 As String = "String1"
          Console.WriteLine("s1 = s2: {0}", Object.ReferenceEquals(s1, s2))
          Console.WriteLine("{0} interned: {1}", s1, 
                            If(String.IsNullOrEmpty(String.IsInterned(s1)), "No", "Yes"))
          Dim suffix As String = "A"
          Dim s3 = "String" + suffix
          Dim s4 = "String" + suffix
          Console.WriteLine("s3 = s4: {0}", Object.ReferenceEquals(s3, s4))
          Console.WriteLine("{0} interned: {1}", s3, 
                            If(String.IsNullOrEmpty(String.IsInterned(s3)), "No", "Yes"))
       End Sub
    End Module
    ' The example displays the following output:
    '       s1 = s2: True
    '       String1 interned: Yes
    '       s3 = s4: False
    '       StringA interned: No

    文字列インターンの詳細については、「」を参照してください String.IsInternedFor more information about string interning, see String.IsInterned.