首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >请解释此代码中用于测试对象相等性和一致性的技术

请解释此代码中用于测试对象相等性和一致性的技术
EN

Stack Overflow用户
提问于 2011-11-04 19:32:57
回答 2查看 183关注 0票数 4

请解释此代码中用于测试对象相等性和同一性的技术。

更好,如果你可以为我提供任何详细讨论的网络链接/书籍参考。

代码语言:javascript
复制
[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;
        }
}

什么是瞬态对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-04 19:41:48

  • 它首先检查other是否是与当前对象类型相同的实例。如果不是,则它们不等于
  • ,然后执行引用相等来检查other和当前对象是否是相同的实例。如果是,那么很明显,如果other和当前对象都是暂时的(也就是还没有持久化的),那么它们就等于
  • ,它们没有ID,所以它们不能通过ID进行比较,而是通过引用进行比较。(正如Marc Gravell在评论中指出的那样,检查对象是否是瞬态的测试是失败的;将int与default(T))
  • Eventually,进行比较是没有意义的;如果它们具有相同的ID

,则认为它们是相等的

票数 3
EN

Stack Overflow用户

发布于 2011-11-04 19:44:29

我认为代码想要做的是说“saved it got a ID not”,也就是说,一个“瞬态”对象(如果我正确地理解了代码的意图)可能是一个还没有保存到数据库的对象。那么相等性被定义为:

  • 如果有ID,是否匹配?(即使是同一类型的不同实例)
  • 如果它没有ID,它是同一对象实例(引用)

不幸的是,这个实现看起来完全崩溃了,因为当T是完全不同的东西(一个BusinessObject<T>)时,Equals(ID, default(T))就没有意义了--因此default(T)将永远是nullID将永远不会 be null (它不能为空)。因此,没有任何东西会报告为暂时的。

此外,下面的代码:

代码语言:javascript
复制
if (null == other || !GetType().IsInstanceOfType(other))

是效率极低吗?我怀疑涉及as的东西会更可取,但是再说一遍:代码看起来如此……被折磨..。我不愿意事后去猜测他的意图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8008612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档