Object.ReferenceEquals(Object, Object) Metoda

Definicja

Określa, czy określone Object wystąpienia są tym samym wystąpieniem.

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

Parametry

objA
Object

Pierwszy obiekt do porównania.

objB
Object

Drugi obiekt do porównania.

Zwraca

true jeśli objA jest to to samo wystąpienie co objB lub jeśli oba są null; w przeciwnym razie false.

Przykłady

W poniższym przykładzie użyto ReferenceEquals funkcji do określenia, czy dwa obiekty są tym samym wystąpieniem.

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

Uwagi

Equals W przeciwieństwie do metody i operatora ReferenceEquals równości nie można zastąpić metody. W związku z tym, jeśli chcesz przetestować dwa odwołania do obiektów pod kątem równości i nie masz pewności co do implementacji Equals metody, możesz wywołać metodę ReferenceEquals .

Jednak zwracana wartość ReferenceEquals metody może wydawać się nietypowa w tych dwóch scenariuszach:

  • Podczas porównywania typów wartości. Jeśli objA i objB są typami wartości, są one pola przed przekazaniem ReferenceEquals ich do metody. Oznacza to, że jeśli oba objBobjA i reprezentują to samo wystąpienie typu wartości, ReferenceEquals metoda jednak zwraca falsemetodę , jak pokazano w poniższym przykładzie.

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

    Aby uzyskać informacje na temat typów wartości boksu, zobacz Boxing and Unboxing (Boxing and Unboxing).

  • Podczas porównywania ciągów. Jeśli objA ciągi i objB są ciągami, metoda zwraca true wartość , ReferenceEquals jeśli ciąg jest internowany. Nie wykonuje testu równości wartości. W poniższym przykładzie są s2 równe, s1 ponieważ są to dwa wystąpienia pojedynczego internowanego ciągu. Jednak i s4 nie są równe, s3 ponieważ chociaż mają identyczne wartości ciągów, ten ciąg nie jest internowany.

    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
    

    Aby uzyskać więcej informacji na temat interningu ciągów, zobacz String.IsInterned.

Dotyczy

Produkt Wersje
.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, 8, 9, 10
.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, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Zobacz też