可能重复:
比较引用类型的两个实例的“最佳实践”是什么?
我的应用程序有这个自定义类。这个类有两个实例(A 和 B),我试图比较它们。但是,我遇到了问题;我正在 IEquatable<T>
使用重写的Equals
方法实现接口以进行此比较。
这些Equals
方法调用了ReferenceEquals
行为不端的函数。
以下是测试用例:
案例1: A和B是不同的实例,包含不同的数据..ReferenceEquals
说:它们是不同的(这是正确的!)
案例 2: A 和 B 是不同的实例,但 B 是使用 A 的变量值实例化的(即 A 和 B 都包含完全相同的数据!)..ReferenceEquals
说:它们不同(这是错误的!)
案例 3: A 和 B 是相同的实例(即 A 被传入两次,例如Equals (A, A)
)ReferenceEquals
说:它们是相同的(这是正确的!)
那么如何让案例 2 的结果也正确呢?
实现的类IEquatable<T>
:
namespace DBtestApp1
{
class QuantityBasedDiscount : IEquatable<QuantityBasedDiscount>
{
public string pType { get; set; }
public string pSubType { get; set; }
public DataTable quantityDiscountsDT { get; set; }
public QuantityBasedDiscount()
{
pType = "";
pSubType = "";
quantityDiscountsDT = new DataTable();
}
public QuantityBasedDiscount(string iProdType, string iProdSubType, DataTable iQuantitiesDT)
{
pType = iProdType;
pSubType = iProdSubType;
quantityDiscountsDT = iQuantitiesDT;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override bool Equals(Object obj)
{
var other = obj as QuantityBasedDiscount;
if (other == null) return false;
return Equals(other);
}
public bool Equals(QuantityBasedDiscount other)
{
if (other == null)
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return false;
}
}
}
调用该Equals
方法的代码(此处为案例 2 配置):
private bool AnyUnsavedChanges()
{
QuantityBasedDiscount copyB = new QuantityBasedDiscount(copyA.pType, copyA.pSubType, copyA.quantityDiscountsDT);
if (copyA.Equals(copyB))
{
return false; //They are the same!
}
else
{
return true; //They are NOT the same!
}
}
那么这段代码有什么问题呢?