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

Второй из сравниваемых объектов.

Возвращаемое значение

Boolean

Значение true, если параметр objA соответствует тому же экземпляру, что и параметр objB, или же оба они являются равны NULL; в противном случае — значение false.

Примеры

В следующем примере используется ReferenceEquals , чтобы определить, являются ли два объекта одним и тем же экземпляром.

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 метод не может быть переопределен. Поэтому, если нужно проверить две ссылки на объекты на равенство и вы не уверены в реализации Equals метода, можно вызвать ReferenceEquals метод.

Однако возвращаемое значение ReferenceEquals метода может показаться аномальным в этих двух сценариях:

  • При сравнении типов значений. Если objA и objB являются типами значений, они упаковываются перед передачей в 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
    

    Дополнительные сведения о типах значений упаковки см. в разделе Упаковка ираспаковка.

  • При сравнении строк. Если objA и objB являются строками, ReferenceEquals метод возвращает значение, true Если строка интернирована. Он не выполняет проверку на равенство значений. В следующем примере s1 и равны, s2 так как они являются двумя экземплярами одной интернированной строки. Однако 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 .

Применяется к

См. также раздел