C#Equalsをオーバーを使用"として"および専門性、柔軟性、性能
-
19-08-2019 - |
質問
目の前を通りがかった私達の実施 正しい柔軟性と高速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)と同じ値を返します。」 異なる結果を与えることのオーバーロードに依存することは、デバッグに非常に微妙だろう。の恐ろしくの問題で終わる可能性があります。
所属していません StackOverflow