1. ホーム
  2. c#

[解決済み] C# .Equals()、.ReferenceEquals()と==演算子

2023-03-25 02:53:09

疑問点

私の理解では、この3つは

  • .Equals() は、データの等質性をテストします (より良い説明はできませんが)。 .Equals() は同じオブジェクトの異なるインスタンスに対して真を返すことができ、これは最も一般的にオーバーライドされるメソッドです。

  • .ReferenceEquals() は、2つのオブジェクトが同じインスタンスであるかどうかをテストし、オーバーライドすることはできません。

  • ==ReferenceEquals() をデフォルトとしますが、これはオーバーライドすることができます。

しかし C#ステーション の状態になります。

オブジェクトクラスでは EqualsReferenceEquals メソッドは は意味的に同じですが は ReferenceEquals は オブジェクトのインスタンスにのみ作用します。 また ReferenceEquals メソッドは静的です。

今、私はそれを得ることはありません。どなたか、この件に光を当てていただけませんか?

どのように解決するのですか?

あなたの混乱の原因は、C# station からの抜粋にタイプミスがあることだと思われます。 と同じです。 はオブジェクトのインスタンスに対してのみ動作します。ReferenceEqualsメソッドはstatic."です。


それぞれの意味上の違いについては、おおよそ正しいです("同じオブジェクトの異なるインスタンス" は少し混乱しているようですが、おそらく "same タイプ と読むべきでしょう)、そして、どれをオーバーライドすることができるかについてです。

それはさておき、質問の最後の部分、すなわち、それらがどのようにプレーンな System.Object インスタンスと System.Object の参照 (ポリモーフィックでない == ). ここでは、3つの操作のすべてが動作します と同じように になりますが、注意点があります。 Equals を呼び出すことはできません。 null .

Equals はインスタンスメソッドで 1 パラメータ (これは である null ). これはインスタンスメソッド (実際のオブジェクトに対して起動される必要がある) なので null -の参照で呼び出すことはできません。

ReferenceEquals は静的メソッドで 2 のどちらか、あるいは両方のパラメータを受け取ります。 null . これは静的なものなので(オブジェクトと関連付けられていない インスタンス を投げることはありません。 NullReferenceException を投げません。

== は演算子で、この場合 ( object ) と同じ振る舞いをします。 ReferenceEquals . これは NullReferenceException も投げません。

説明するために

object o1 = null;
object o2 = new object();

//Technically, these should read object.ReferenceEquals for clarity, but this is redundant.
ReferenceEquals(o1, o1); //true
ReferenceEquals(o1, o2); //false
ReferenceEquals(o2, o1); //false
ReferenceEquals(o2, o2); //true

o1.Equals(o1); //NullReferenceException
o1.Equals(o2); //NullReferenceException
o2.Equals(o1); //false
o2.Equals(o2); //true