英語で読む

次の方法で共有


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

比較する 2 番目のオブジェクト。

戻り値

objAobjB と同一のインスタンスである場合、または両方のインスタンスが null 参照の場合は true。それ以外の場合は false

次の例では、 を使用 ReferenceEquals して、2 つのオブジェクトが同じインスタンスであるかどうかを判断します。

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オーバーライドすることはできません。 このため、2 つのオブジェクト参照の等価性をテストし、メソッドの Equals 実装について不明な場合は、 メソッドを ReferenceEquals 呼び出すことができます。

ただし、メソッドの戻り値は、次の ReferenceEquals 2 つのシナリオでは異常に見える場合があります。

  • 値の型を比較する場合。 と objB が値型の場合objA、メソッドに渡される前にボックス化されますReferenceEquals。 つまり、 と objB の両方objAが値型の同じインスタンスを表している場合、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
    

    ボックス化値の型の詳細については、「 ボックス化とボックス化解除」を参照してください。

  • 文字列を比較する場合。 と objB が文字列の場合objA、文字列がReferenceEqualsインターンされている場合、メソッドは を返しますtrue。 値の等価性のテストは実行されません。 次の例では、 s1s2 は等しくなります。これは、1 つのインターン文字列の 2 つのインスタンスであるためです。 ただし、 s3s4 は等しくありません。これは、同じ文字列値を持ちますが、その文字列はインターンされないためです。

    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, 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

こちらもご覧ください