4

CLRタイプが次とは異なる結果を返すかどうか疑問に思っています。

Object.Equals(objA, objB)

objA.Equals(objB)

(objA == objB)

私は、CLRの外部で、誰かがIEqualtableEqualsを簡単に実装し、==演算子を不適切にオーバーロードする可能性があることを認識しています。私はこれらを不適切に実装している人々には関心がありません。私が懸念しているのは、クラス(String、Int32などを含む)がこれら3つを異なる方法で実装していることです。

また、可能であれば、全体(全体)の比較に使用するものをどれにする必要があります。Object.Equals(objA, objB)他の2つではなくビューモデル全体を使用するファイルに出くわしたので、これは疑問に思います。

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (Equals(_name, value)) return;
        ...
    }
}

private int _id;
public int Id
{
    get { return _id; }
    set
    {
        if (Equals(_id, value)) return;
        ...
    }
}

private Object _obj;
public Object TheObject
{
    get { return _obj; }
    set
    {
        if (Equals(_obj, value)) return;
        ...
    }
}
4

2 に答える 2

6

Object.Equals(a、b)はnullセーフです。それは真である例えばEquals(null、null)に答えることができます。それとは別に、通常のEquals()メソッドを呼び出すだけです。私の知る限り、clr文字列型とプリミティブ型には、Object.Equals(a、b)とまったく同じように機能する等価演算子が定義されています。

null以外のobjAおよびobjBの場合、Equalsメソッドが正しく実装されていれば、Object.Equals(objA、objB)、objA.Equals(objB)、およびobjB.Equals(objA)は同等である必要があります。

投稿したコードでは、Equals(_obj、value)の使用は正しいようです。

同等性の比較の完全なリストが必要な場合は、多くのシナリオで役立つ一種の同等性であるobjA.ReferenceEquals(objB)を忘れないでください。

于 2011-11-08T15:36:28.047 に答える
1

任意の浮動小数点数に対してEquals==動作が異なります。

  • NaN==NaN => false次のIEEEロジック
  • NaN.Equals(NaN) => true何かがそれ自体と等しくなければならないという要件に従う。

そしてもちろんEqualsオーバーライドされます。つまり、静的タイプが基本タイプの場合でも==機能しますが、オーバーロードされ、静的タイプがオーバーロードされている場合にのみ機能します。

x.Equals(y)直接電話することはほとんどありません。一つには、それは存在を処理せずxnullその非対称性は醜いIMOです。staticobject.Equals(x,y)は仮想object.Equals(y)メソッドを呼び出しますが、null処理を追加します。

IEquatable<T>.Equals(other)はすべての正常に動作する型と同等ですがobject.Equals(other)、値型でのボックス化を回避します。

結論として、私は通常==、静的型が既知でありEqualityComparer<T>.Default、ジェネリック型を使用する場合、または静的型が実行時型と一致しない場合を好みます。


あなたの例Nameでは、とは封印されているので、ととId同じように動作します。==Equalsstringint

TheObject一方、特定のタイプでは、特定のタイプで異なる動作を示し==ますEquals。たとえば、を使用する場合stringEquals、値の等式==を使用し、参照の等式を使用します。

于 2011-11-08T15:45:53.097 に答える