gpt4 book ai didi

c# - 请解释此代码中用于测试对象相等性和身份的技术

转载 作者:太空狗 更新时间:2023-10-30 01:08:59 25 4
gpt4 key购买 nike

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

更好的是,如果您能提供任何网络链接/书籍引用以供详细讨论。

[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;
}
}

什么是 transient 对象?

最佳答案

  • 它首先检查other 是否是与当前对象相同类型的实例。如果不是,则它们不相等
  • 然后它执行引用相等性来检查 other 和当前对象是否是同一个实例。如果是,显然他们是平等的
  • 如果 other 和当前对象都是 transient 的(即尚未持久化),则它们没有 ID,因此无法通过 ID 进行比较。相反,它们通过引用进行比较。 (正如 Marc Gravell 在评论中指出的那样,检查对象是否为 transient 的测试已损坏;将 int 与 default(T) 进行比较没有意义)
  • 最后,比较他们的 ID;如果对象具有相同的 ID,则认为它们相等

关于c# - 请解释此代码中用于测试对象相等性和身份的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8008612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com