比較する必要がある可能性のあるデータを保持する可能性が高い新しいclass
またはを書くときはいつでも、強く型付けされたメソッドを提供するため、常に実装します。struct
IEquatable<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
に対してチェックするだけです。では、例外をスローするか、単に返す方がよいでしょうか?as
null
this
null
false
編集: かなりの数の仲間の SO'er によって指摘されているように、構造体を null にすることはできないため、2 番目のオプションは構造体には適用されません。したがって、別の疑問が頭に浮かびます: オーバーライドされた実装は.Equals(object obj)
、構造体とクラスで同一である必要がありますか?