3

基本的にタイトル。私が取り組んでいるコードには前者が多く見られますが、なぜ後者を使用しなかったのか疑問に思っていました。両者に違いはありますか?

ありがとう。

4

3 に答える 3

2

あまり。をオーバーロードできるoperator ==ので、基本的にはfalse常に返すことができます。この演算子の推奨される使用法は、値が等しいことを示すことです。そのため、(正しく実装された演算子のnull 場合) 基本的に、オブジェクトが意味的にnull.

詳細と歴史的な概要については、この記事を参照してください。

もう 1 つの違いは、値型の場合ReferenceEqualsはあまり意味がないことです。たとえば、の 2 つの「インスタンス」はint 0、正常な状況では同じと見なす必要があります。(純粋主義者向け: 厳密に言えば、値型のインスタンスについて話すことはできないため、引用符を付けます。)

于 2012-10-16T15:32:41.177 に答える
2

ドキュメントから直接

Equals メソッドや等価演算子とは異なり、ReferenceEquals メソッドはオーバーライドできません。このため、2 つのオブジェクト参照が等しいかどうかをテストする必要があり、Equals メソッドの実装が不明な場合は、ReferenceEquals メソッドを呼び出すことができます。ただし、objA と objB が値型の場合は、ReferenceEquals メソッドに渡される前にボックス化されることに注意してください。

于 2012-10-16T15:33:34.540 に答える
1

の主な利点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.
    }
 }
于 2012-10-16T15:41:24.400 に答える