質問

目の前を通りがかった私達の実施 正しい柔軟性と高速Equalsクライアントまで、フルのC#でも利用できるため実質的に任意のクラスおよび状況.きっかけになるかもしれないとする専門Equalsをオブジェクトの実際のクラスとしてのパラメータ)が必要になる。なコードの重複は、Equalsのある専門Equals.Nullチェックを行う一度だけでも継承されます。

私は、ついにこの日が来てしまったこのデザイン:


class MyClass
{
    public Int32 SomeValue1 = 1;
    public Int32 SomeValue2 = 25;

    // Ignoring GetHashCode for simplicity.

    public override bool Equals(object obj)
    {
        return Equals (obj as MyClass);
    }

    public bool Equals(MyClass obj)
    {
        if (obj == null) {
            return false;
        }

        if (!SomeValue1.Equals (obj.SomeValue1)) {
            return false;
        }

        if (!SomeValue2.Equals (obj.SomeValue2)) {
            return false;
        }

        return true;
    }
}

class MyDerivedClass : MyClass
{
    public Int32 YetAnotherValue = 2;

    public override bool Equals(object obj)
    {
        return Equals (obj as MyDerivedClass);
    }

    public bool Equals(MyDerivedClass obj)
    {
        if (!base.Equals (obj)) {
            return false;
        }

        if (!YetAnotherValue.Equals (obj.YetAnotherValue)) {
            return false;
        }

        return true;
    }
}

重要なアイデア:

  • の利用"として"オペレーターこのようにしていチェックのためのnullに等しい.クラスが間違ってい種類の取得に減nullの場合、ソートの専門Equals.
  • Nullチェックでちょうど一点もの由来。
  • チェックの属性の一つ一つを明確にします。

があるの欠陥このコンセプトかんせん。

役に立ちましたか?

解決

さまざまなタイプが含まれる場合、

あなたのEqualsメソッドは再帰ではありません。

MyDerivedClass mdc = new MyDerivedClass();
MyClass mc = new MyClass();
Object omdc = mdc;
Object omc = mc;

// mc.Equals(mdc) - true
// mdc.Equals(mc) - true by calling the right overload
// omc.Equals(omdc) - true
// omdc.Equals(omc) - false, the "as" in MyDerivedClass will result in null

このラウンドの通常の方法で使用することです。

if (GetType() != other.GetType())
{
    return false;
}
「x.Equals:

はObject.equals の中のドキュメントを参照してください。 (y)はy.Equals(X)と同じ値を返します。」 異なる結果を与えることのオーバーロードに依存することは、デバッグに非常に微妙だろう。の恐ろしくの問題で終わる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top