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.

傳回

如果 objAobjB 為相同的執行個體或兩者皆為 null,則為 true否則為 falsetrue 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. 如果objAobjB是實值類型,它們會進行 boxed 處理之前傳遞至ReferenceEquals方法。If objA and objB are value types, they are boxed before they are passed to the ReferenceEquals method. 這表示,如果這兩個objAobjB代表相同的執行個體的實值型別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
    

    如需 boxing 實值型別資訊,請參閱Boxing 和 UnboxingFor information on boxing value types, see Boxing and Unboxing.

  • 當比較字串。When comparing strings. 如果objAobjB都是字串,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. 在下列範例中,s1s2相等,因為它們是兩個執行個體的單一保留的字串。In the following example, s1 and s2 are equal because they are two instances of a single interned string. 不過,s3s4不相等,因為它們都有相同的字串值,雖然未保留該字串。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.IsInternedFor more information about string interning, see String.IsInterned.

適用於

另請參閱