4

オブジェクトの同等性とアイデンティティをテストするためにこのコードで使用される手法を説明してください。

詳細な議論のために私にウェブリンク/本の参照を提供することができればもっと良いです。

[Serializable]
    public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
    {
        private int? requestedHashCode;

        public virtual int ID { get; set; }

        public virtual bool Equals(IBusinessObject other)
        {
            if (null == other || !GetType().IsInstanceOfType(other))
            {
                return false;
            }
            if (ReferenceEquals(this, other))
            {
                return true;
            }

            bool otherIsTransient = Equals(other.ID, default(T));
            bool thisIsTransient = IsTransient();
            if (otherIsTransient && thisIsTransient)
            {
                return ReferenceEquals(other, this);
            }

            return other.ID.Equals(ID);
        }

        protected bool IsTransient()
        {
            return Equals(ID, default(T));
        }

        public override bool Equals(object obj)
        {
            var that = obj as IBusinessObject;
            return Equals(that);
        }

        public override int GetHashCode()
        {
            if (!requestedHashCode.HasValue)
            {
                requestedHashCode = IsTransient() ? base.GetHashCode() : ID.GetHashCode();
            }
            return requestedHashCode.Value;
        }
}

一時オブジェクトとは何ですか?

4

2 に答える 2

3
  • 最初otherに、が現在のオブジェクトと同じタイプのインスタンスであるかどうかを確認します。そうでない場合、それらは等しくありません
  • 次に、参照の等式を実行してother、現在のオブジェクトが同じインスタンスであるかどうかを確認します。もしそうなら、明らかにそれらは等しい
  • 両方otherと現在のオブジェクトが一時的である(つまり、まだ永続化されていない)場合、それらにはIDがないため、IDで比較することはできません。代わりに、それらは参照によって比較されます。(コメントでMarc Gravellが指摘しているように、オブジェクトが一時的であるかどうかを確認するテストは壊れています。intをdefault(T)と比較することは意味がありません)
  • 最終的に、それらのIDが比較されます。同じIDを持つオブジェクトは、等しいと見なされます
于 2011-11-04T11:41:48.463 に答える
2

コードが行おうとしているのは、「IDをまだ取得している」ということだと思います。つまり、「一時的な」オブジェクトは(コードの意図を正しく読み取った場合)、まだDBに保存されていないオブジェクトである可能性があります。次に、平等は次のように定義されます。

  • IDがある場合、一致しますか?(同じタイプの異なるインスタンスの場合でも)
  • IDがない場合は、同じオブジェクトインスタンスですか(参照)

残念ながら、実装は完全に壊れているように見えます。完全に異なるもの(a )のEquals(ID, default(T))場合は無意味です。したがって、常にそうであり、決してそうではありません(null許容ではありません)。したがって、一時的なものとして報告されるものはありません。TBusinessObject<T>default(T)nullIDnull

さらに、このコード:

if (null == other || !GetType().IsInstanceOfType(other))

非常に非効率的です。関係する何かasがはるかに望ましいと思いますが、繰り返しますが、コードはとても...拷問されているように見えます...私はその意図を二番目に推測するのが嫌いです。

于 2011-11-04T11:44:28.560 に答える