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

如果 objA 是与 objB 相同的实例,或如果两者均为 null,则为 true,否则为 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
    

    有关装箱值类型的信息,请参阅 装箱和取消装箱

  • 比较字符串时。 如果 objA 字符串和 objB 字符串为字符串,该方法 ReferenceEqualstrue 返回字符串是实习生的。 它不对值相等性执行测试。 在下面的示例中, s1 并且 s2 相等,因为它们是单个实习生字符串的两个实例。 但是, s3 并且 s4 不相等,因为它们虽然具有相同的字符串值,但该字符串不是实习生。

    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

另请参阅