Object.ReferenceEquals(Object, Object) Method (System) (original) (raw)

Definition

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

Parameters

objA

Object

The first object to compare.

objB

Object

The second object to compare.

Returns

true if objA is the same instance as objB or if both are null; otherwise, false.

Examples

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

*/
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
let o: obj = null
let mutable p: obj = null
let q = obj ()

printfn $"{Object.ReferenceEquals(o, p)}"
p <- q
printfn $"{Object.ReferenceEquals(p, q)}"
printfn $"{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
'

Remarks

Unlike the Equals method and the equality operator, the ReferenceEquals method cannot be overridden. 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.

However, the return value of the ReferenceEquals method may appear to be anomalous in these two scenarios:

int int1 = 3;  
Console.WriteLine(Object.ReferenceEquals(int1, int1));  
Console.WriteLine(int1.GetType().IsValueType);  
// The example displays the following output:  
//       False  
//       True  
let int1 = 3  
printfn $"{Object.ReferenceEquals(int1, int1)}"  
printfn $"{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.

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  
open System  
let s1 = "String1"  
let s2 = "String1"  
printfn $"s1 = s2: {Object.ReferenceEquals(s1, s2)}"  
printfn $"""{s1} interned: {if String.IsNullOrEmpty(String.IsInterned s1) then "No" else "Yes"}"""  
let suffix = "A"  
let s3 = "String" + suffix  
let s4 = "String" + suffix  
printfn $"s3 = s4: {Object.ReferenceEquals(s3, s4)}"  
printfn $"""{s3} interned: {if String.IsNullOrEmpty(String.IsInterned s3) then "No" else "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  

For more information about string interning, see String.IsInterned.

Applies to

See also