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

Второй объект для сравнения.

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

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

Примеры

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

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
'

Комментарии

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

    Сведения о типах значений бокса см. в разделе "Бокс" и "Распаковка".

  • При сравнении строк. Если 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
    
    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
    

    Дополнительные сведения о интернинге строк см. в разделе String.IsInterned.

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

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