请解释此代码中用于测试对象相等性和同一性的技术。
更好,如果你可以为我提供任何详细讨论的网络链接/书籍参考。
[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;
}
}什么是瞬态对象?
发布于 2011-11-04 19:41:48
other是否是与当前对象类型相同的实例。如果不是,则它们不等于other和当前对象是否是相同的实例。如果是,那么很明显,如果other和当前对象都是暂时的(也就是还没有持久化的),那么它们就等于,则认为它们是相等的
发布于 2011-11-04 19:44:29
我认为代码想要做的是说“saved it got a ID not”,也就是说,一个“瞬态”对象(如果我正确地理解了代码的意图)可能是一个还没有保存到数据库的对象。那么相等性被定义为:
吗
不幸的是,这个实现看起来完全崩溃了,因为当T是完全不同的东西(一个BusinessObject<T>)时,Equals(ID, default(T))就没有意义了--因此default(T)将永远是null,ID将永远不会 be null (它不能为空)。因此,没有任何东西会报告为暂时的。
此外,下面的代码:
if (null == other || !GetType().IsInstanceOfType(other))是效率极低吗?我怀疑涉及as的东西会更可取,但是再说一遍:代码看起来如此……被折磨..。我不愿意事后去猜测他的意图。
https://stackoverflow.com/questions/8008612
复制相似问题