4

比較する必要がある可能性のあるデータを保持する可能性が高い新しいclassまたはを書くときはいつでも、強く型付けされたメソッドを提供するため、常に実装します。structIEquatable<T>class/struct.Equals(T other)

例:

public struct Radius : IEquatable<Radius>
{
    public Int32 TopLeft { get; set; }
    public Int32 TopRight { get; set; }
    public Int32 BottomLeft { get; set; }
    public Int32 BottomRight { get; set; }

    public bool Equals(Radius other)
    {
        return this.TopLeft == other.TopLeft
            && this.TopRight == other.TopRight
            && this.BottomLeft == other.BottomLeft
            && this.BottomRight == other.BottomRight;
    }
}

の実装を提供するだけでなく.Equals(Radius other)、デフォルトの実装もオーバーライドする必要があります ( .Equals(object obj))

ここには 2 つのオプションがあります。私の質問は、これらの実装のどちらが優れているかということです。

オプション 1 は、キャストを使用することです。

public override bool Equals(object obj)
{
    return this.Equals((Radius)obj);
}

オプション 2 は、「as」キーワードを使用することです。

public override bool Equals(object obj)
{
    return this.Equals(obj as Radius);
}

これを尋ねる理由は、キャストを使用すると、objにキャストできない場合は例外がスローされますが、キャストできない場合は に解決されるため、例外をスローせずにRadiusに対してチェックするだけです。では、例外をスローするか、単に返す方がよいでしょうか?asnullthisnullfalse

編集: かなりの数の仲間の SO'er によって指摘されているように、構造体を null にすることはできないため、2 番目のオプションは構造体には適用されません。したがって、別の疑問が頭に浮かびます: オーバーライドされた実装は.Equals(object obj)、構造体とクラスで同一である必要がありますか?

4

3 に答える 3

7

Equals()メソッドが例外をスローしてはなりません

異なるタイプのオブジェクトは単に等しくありません。

ドキュメントの引用:

Equals の実装は例外をスローしてはなりません。それらは常に値を返す必要があります。たとえば、obj が null の場合、Equals メソッドは ArgumentNullException をスローする代わりに false を返す必要があります。

于 2013-08-07T15:34:22.490 に答える
5

@SLaks が既に述べたように、Equals()決してスローしないでください。

この特別なケースisでは、キャストと組み合わせた演算子の使用法が役立つと思います:

public override bool Equals(object obj)
{
     if(obj is Radius)
         return Equals((Radius)obj);

     return false;
}

がある場合は、class単純にas演算子を使用する必要があります。

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

public bool Equals(MyObj obj)
{
     if(ReferenceEquals(obj, null))
         return false;

     // ToDo: further checks for equality.
}
于 2013-08-08T09:12:04.040 に答える
-1

私の個人的な意見では、2 番目のオプションを使用するか、オブジェクトが「半径」であるかどうかを事前に確認してから false を返して、意図がより明確になるようにすることです。

于 2013-08-07T15:35:31.843 に答える