Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Method

定義

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

public:
 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

パラメーター

objA
Object Object Object Object

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

objB
Object Object Object Object

比較する 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.

True
True
False

*/
using System;

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


/*

This code produces the following output.

True
True
False

*/
Imports System

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.

ただし、戻り値のReferenceEqualsこれら 2 つのシナリオでは異常と考えられるメソッドがあります。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. つまり、両方objAobjB値の型の同じインスタンスを表す、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.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          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
    

    値型のボックス化については、次を参照してください。ボックス化とボックス化解除します。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. 次の例では、s1s2隔離された単一の文字列の 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 are have identical string values, that string is not interned.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          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します。For more information about string interning, see String.IsInterned.

適用対象

こちらもご覧ください