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”,即一个“瞬态”对象可能(如果我正确阅读代码的意图)是一个尚未保存到数据库的对象。那么相等定义为:

  • 如果它有一个ID,它匹配吗?(即使对于相同类型的不同实例)
  • 如果它没有 ID,它是否是同一个对象实例(参考)

不幸的是,实现看起来完全被破坏了,因为当完全不同的东西(a )Equals(ID, default(T))时毫无意义- 因此将永远是并且永远不会是(它不是可以为空的)。因此,没有任何东西会报告为瞬态的。TBusinessObject<T>default(T)nullIDnull

此外,此代码:

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

效率非常低。我怀疑涉及的东西as会更可取,但同样:代码看起来如此......折磨......我讨厌事后猜测意图。

于 2011-11-04T11:44:28.560 回答