基本的にタイトル。私が取り組んでいるコードには前者が多く見られますが、なぜ後者を使用しなかったのか疑問に思っていました。両者に違いはありますか?
ありがとう。
あまり。をオーバーロードできるoperator ==
ので、基本的にはfalse
常に返すことができます。この演算子の推奨される使用法は、値が等しいことを示すことです。そのため、(正しく実装された演算子のnull
場合) 基本的に、オブジェクトが意味的にnull
.
詳細と歴史的な概要については、この記事を参照してください。
もう 1 つの違いは、値型の場合ReferenceEquals
はあまり意味がないことです。たとえば、の 2 つの「インスタンス」はint 0
、正常な状況では同じと見なす必要があります。(純粋主義者向け: 厳密に言えば、値型のインスタンスについて話すことはできないため、引用符を付けます。)
ドキュメントから直接
Equals メソッドや等価演算子とは異なり、ReferenceEquals メソッドはオーバーライドできません。このため、2 つのオブジェクト参照が等しいかどうかをテストする必要があり、Equals メソッドの実装が不明な場合は、ReferenceEquals メソッドを呼び出すことができます。ただし、objA と objB が値型の場合は、ReferenceEquals メソッドに渡される前にボックス化されることに注意してください。
の主な利点ReferenceEquals()
は、意図がはるかに明確であることです。参照されているオブジェクトの内容が等しいかどうかではなく、2 つの参照が等しいかどうかを判断しようとしています。
これは、にoperator ==
キャストされた 2 つの参照が等しいかどうかをチェックすることによって行われますobject
(パラメーターが bothobject
であるため)。operator ==
string
本質的に、これは:
if (ReferenceEquals(x, y))
これと同じです:
if (((object)x) == ((object)y))
前者の方が読みやすいですが。
operator ==
特に自分自身をオーバーロードしているときに無限再帰を回避するのに便利な場合があります。
public class Foo
{
public static bool operator ==(Foo first, Foo second)
{
// can't say if (first == second) here or infinite recursion...
if (ReferenceEquals(first, second))
{
// if same object, obviously same...
return true;
}
// etc.
}
}