C# 如何检查c++/cli ref项是否相等?
c++/cli ref类C# 如何检查c++/cli ref项是否相等?,c#,c++-cli,equals,equality,C#,C++ Cli,Equals,Equality,c++/cli ref类DataEntity实现Equals和HashCode。我可以通过以下方式检查Equals实现的行为: entity1.Equals(entity2); (C#源)并且它工作正常。 如果我现在有一个这样的数据实体列表,并且我调用list1.Equals(list2),那么DataEntity#Equals方法永远不会被调用 原因是什么?如何正确使用List.Equals(…)方法 C++/CLI源代码: public ref class DataEntity : Sy
DataEntity
实现Equals和HashCode。我可以通过以下方式检查Equals
实现的行为:
entity1.Equals(entity2);
(C#源)并且它工作正常。
如果我现在有一个这样的数据实体列表,并且我调用list1.Equals(list2)
,那么DataEntity#Equals
方法永远不会被调用
原因是什么?如何正确使用List.Equals(…)方法
C++/CLI源代码:
public ref class DataEntity : System::Object
{
public:
DataEntity(System::String^ name,
System::String^ val)
: m_csName(name),
m_csValue(val) {}
System::String^ GetName() { return m_csName; }
System::String^ GetValue() { return m_csValue; }
virtual bool Equals(Object^ obj) override {
if(!obj){
return false;
}
DataEntity^ other = (DataEntity^)obj;
if(other){
if(m_csName->Equals(other->m_csName) &&
m_csValue->Equals(other->m_csValue)){
return true;
}
return false;
}
return false;
}
virtual int GetHashCode() override {
const int iPrime = 17;
long iResult = 1;
iResult = iPrime * iResult + m_csName->GetHashCode();
iResult = iPrime * iResult + m_csValue->GetHashCode();
return iPrime;
}
private:
System::String^ m_csName;
System::String^ m_csValue;
};
C#单元测试用例失败强>
[Test]
public void Test()
{
DataEntity de1 = new DataEntity("A", "B");
List<DataEntity> des1 = new List<DataEntity>();
des1.Add(de1);
List<DataEntity> des2 = new List<DataEntity>();
des2.Add(de1);
Assert.IsTrue(des1.Equals(des2));
}
[测试]
公开无效测试()
{
数据实体de1=新的数据实体(“A”、“B”);
List des1=新列表();
des1.添加(de1);
List des2=新列表();
des2.添加(de1);
Assert.IsTrue(des1.Equals(des2));
}
列表
不会覆盖对象。等于
。因此,您将获得Equals的默认实现,即引用equality
为了测试列表内容是否相等,您需要迭代列表并比较每个元素,或者使用链接重复问题中提到的Linq方法。在单元测试的情况下,有一种实用方法称为:
CollectionAssert.AreEqual(expectedList, actualList);
这就简化了很多