Object.ReferenceEquals(Object, Object) Метод

Определение

Определяет, совпадают ли указанные экземпляры Object.

C#
public static bool ReferenceEquals (object objA, object objB);
C#
public static bool ReferenceEquals (object? objA, object? objB);

Параметры

objA
Object

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

objB
Object

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

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

Boolean

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

Примеры

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

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

Комментарии

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

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

  • При сравнении типов значений. Если objA и objB являются типами значений, они упаковываются перед их передачей в ReferenceEquals метод. Это означает, что если оба objA и представляют один и objB тот же экземпляр типа значения, метод, тем не менее, ReferenceEquals возвращается false, как показано в следующем примере.

    C#
    int int1 = 3;
    Console.WriteLine(Object.ReferenceEquals(int1, int1));
    Console.WriteLine(int1.GetType().IsValueType);
    
    // The example displays the following output:
    //       False
    //       True
    

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

  • При сравнении строк. Если objA и objB являются строками, метод возвращаетсяtrue, ReferenceEquals если строка интернирована. Он не выполняет проверку на равенство значений. В следующем примере и s2 равны, s1 так как они являются двумя экземплярами одной интернированной строки. Однако и s4 не равны, s3 так как они имеют идентичные строковые значения, эта строка не интернирована.

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

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

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

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

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