アプリケーション用にこのカスタム クラスがあります。このクラスには 2 つのインスタンス (A と B) があり、比較しようとしています。ただし、問題があります。IEquatable<T>
オーバーライドされたメソッドを使用して、この比較を行うためのインターフェイスを実装して いますEquals
。
Equals
メソッドは関数を呼び出しますが、ReferenceEquals
これは動作が正しくありません。
テストケースは次のとおりです。
ケース 1: A と B は異なるインスタンスであり、異なるデータが含まれています..ReferenceEquals
言う: それらは異なります (これは正しいです!)
ケース 2: A と B は異なるインスタンスですが、B は A の変数値を使用してインスタンス化されました (つまり、A と B の両方にまったく同じデータが含まれています!) ..ReferenceEquals
言う: それらは異なります (これは間違っています!)
ケース 3: A と B が同じインスタンスである (つまり、A が 2 回渡されるなど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!
}
}
では、このコードの問題は何ですか?