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

定義

指定した複数の Object インスタンスが同一インスタンスかどうかを判断します。

public:
 static bool ReferenceEquals(System::Object ^ objA, System::Object ^ objB);
public static bool ReferenceEquals (object objA, 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

パラメーター

objA
Object

比較する最初のオブジェクト。

objB
Object

比較する 2 番目のオブジェクト。

戻り値

Boolean

objAobjB と同一のインスタンスである場合、または両方のインスタンスが null 参照の場合は true。それ以外の場合は false

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

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.

True
True
False

*/
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 はオーバーライドできません。 このため、2 つのオブジェクト参照の等値をテストする場合に、 メソッドの実装が不明な場合は、 メソッド Equals を呼び出 ReferenceEquals します。

ただし、 メソッドの戻り値は、次の 2 つのシナリオ ReferenceEquals では異常に見えます。

  • 値型を比較する場合。 と objAobjB 値型の場合は、メソッドに渡される前にボックスに入 ReferenceEquals されます。 つまり、 と の両方が値型の同じインスタンスを表す場合、次の例に示すように、 メソッドは objA objB ReferenceEquals false を返します。

    int int1 = 3;
    Console.WriteLine(Object.ReferenceEquals(int1, int1));
    Console.WriteLine(int1.GetType().IsValueType);
    
    // 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))
          Console.WriteLine(int1.GetType().IsValueType)
       End Sub
    End Module
    ' The example displays the following output:
    '       False
    '       True
    

    値型のボックス化の詳細については、「ボックス化とボックス 化解除」を参照してください

  • 文字列を比較する場合。 と objAobjB 文字列の場合、文字列 ReferenceEquals がインターン true された場合、メソッドは を返します。 値の等値のテストは実行されない。 次の例では、 と は、1 つのインターン文字列の s1 s2 2 つのインスタンスなので、等しくなります。 ただし、 と は等しくないのは、同じ文字列値を持つが、その文字列はインターン s3 s4 化されないためです。

    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.IsInterned

適用対象

こちらもご覧ください