# Object.ReferenceEquals(Object, Object) Método

## Definición

Determina si las instancias de Object especificadas son la misma instancia.

``````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``

#### Parámetros

objA
Object

Primer objeto que se va a comparar.

objB
Object

Segundo objeto que se va a comparar.

#### Devoluciones

Boolean

Es `true` si `objA` es la misma instancia que `objB`, o si ambos son null; en caso contrario, es `false`.

## Ejemplos

En el ejemplo siguiente se usa ReferenceEquals para determinar si dos objetos son la misma instancia.

``````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
'
``````

## Comentarios

A diferencia del Equals método y el operador de igualdad, el ReferenceEquals método no se puede invalidar. Por este motivo, si desea probar dos referencias de objeto para comprobar la igualdad y no está seguro acerca de la implementación del `Equals` método , puede llamar al ReferenceEquals método .

Sin embargo, el valor devuelto del ReferenceEquals método puede parecer anómalo en estos dos escenarios:

• Al comparar tipos de valor. Si `objA` y `objB` son tipos de valor, se colocan en la conversión boxing antes de pasarlos al ReferenceEquals método . Esto significa que si y `objA``objB` representan la misma instancia de un tipo de valor, el ReferenceEquals método devuelve `false`sin embargo , como se muestra en el ejemplo siguiente.

``````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
``````

Para obtener información sobre los tipos de valor de conversión boxing, vea Boxing y Unboxing.

• Al comparar cadenas. Si `objA` y `objB` son cadenas, el ReferenceEquals método devuelve `true` si la cadena está internada. No realiza una prueba de igualdad de valores. En el ejemplo siguiente, `s1` y `s2` son iguales porque son dos instancias de una sola cadena internada. Sin embargo, `s3` y `s4` no son iguales, porque aunque tienen valores de cadena idénticos, esa cadena no está internada.

``````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
``````

Para obtener más información sobre el internamiento de cadenas, vea String.IsInterned.