Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Object.ReferenceEquals(Object, Object) Method

Определение

Определяет, совпадают ли указанные экземпляры Object.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);
static member ReferenceEquals : obj * obj -> bool
Public Shared Function ReferenceEquals (objA As Object, objB As Object) As Boolean

Параметры

objA
Object Object Object Object

Первый из сравниваемых объектов.The first object to compare.

objB
Object Object Object Object

Второй из сравниваемых объектов.The second object to compare.

Возвраты

Значение true, если параметр objA соответствует тому же экземпляру, что и параметр objB, или же оба они имеют значение NULL; в противном случае значение false.true if objA is the same instance as objB or if both are null; otherwise, false.

Примеры

В следующем примере используется ReferenceEquals для определения того, если два объекта являются одним экземпляром.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

*/
using System;

class MyClass {

   static void Main() {
      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

*/
Imports System

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 метод не может быть переопределен.Unlike the Equals method and the equality operator, the ReferenceEquals method cannot be overridden. Из-за этого, если вы хотите протестировать две ссылки на объекты на равенство, и вы не знаете о реализации Equals метод, можно вызвать ReferenceEquals метод.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.

Тем не менее возвращаемое значение ReferenceEquals метод может показаться подозрительной активности в этих двух сценариев:However, the return value of the ReferenceEquals method may appear to be anomalous in these two scenarios:

  • При сравнении типов значений.When comparing value types. Если objA и objB являются типами значений, они упакованы, прежде чем они будут переданы ReferenceEquals метод.If objA and objB are value types, they are boxed before they are passed to the ReferenceEquals method. Это означает, что если оба objA и objB тем же экземпляром типом значения, представляющие ReferenceEquals тем не менее, метод возвращает false, как показано в следующем примере.This means that if both objA and objB represent the same instance of a value type, the ReferenceEquals method nevertheless returns false, as the following example shows.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          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
    

    Сведения о упаковки-преобразования типов значений, см. в разделе упаковка-преобразование и распаковка-преобразование.For information on boxing value types, see Boxing and Unboxing.

  • При сравнении строк.When comparing strings. Если objA и objB представляют собой строки, ReferenceEquals возвращает метод true Если интернировано строки.If objA and objB are strings, the ReferenceEquals method returns true if the string is interned. Он не выполняет проверку на предмет равенства значений.It does not perform a test for value equality. В следующем примере s1 и s2 равны, поскольку они являются два экземпляра одной интернированные строки.In the following example, s1 and s2 are equal because they are two instances of a single interned string. Тем не менее s3 и s4 не равны, так как несмотря на то, что они являются имеют идентичные строковые значения, эта строка не начал работать.However, s3 and s4 are not equal, because although they are have identical string values, that string is not interned.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          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.For more information about string interning, see String.IsInterned.

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

Дополнительно