C# 什么样的支票收款资产

C# 什么样的支票收款资产,c#,assertions,C#,Assertions,我在阅读MSDN中的方法CollectionAssert.AreEquivalent: 如果两个集合具有相同数量的相同元素,但顺序不同,则它们是等价的。如果元素的值相等,则元素相等,而不是引用同一对象 我在Visual Studio中尝试了以下代码: var first = new TradeData { ID = "A", MarketPrice = 0 }; var mockFir = new TradeData { ID = "A", MarketPrice = 0 }; var coll

我在阅读MSDN中的方法
CollectionAssert.AreEquivalent

如果两个集合具有相同数量的相同元素,但顺序不同,则它们是等价的。如果元素的值相等,则元素相等,而不是引用同一对象

我在Visual Studio中尝试了以下代码:

var first = new TradeData { ID = "A", MarketPrice = 0 };
var mockFir = new TradeData { ID = "A", MarketPrice = 0 };
var collection = new List<TradeData> { first };
var mockCollection = new List<TradeData> { mockFir };
CollectionAssert.AreEquivalent(collection, mockCollection);
var first=newtradedata{ID=“A”,MarketPrice=0};
var mockFir=newtradedata{ID=“A”,MarketPrice=0};
var collection=新列表{first};
var mockCollection=新列表{mockFir};
CollectionAssert.AreEquivalent(collection,mockCollection);
但我有一个例外:

CollectionAssert.AreEquivalent失败


所以,我的问题是:当MSDN说“如果元素的值相等,而不是它们引用同一个对象,则元素相等”时,它的确切含义是什么

因为
TradeData
类不重写
对象.Equals
,所以基本实现接管,通过引用比较两个对象。虽然
first
mockFir
包含相同的值,但它们不是相同的对象,因此不认为它们相等。如果您在
TradeData
类中重写
Equals
,您的示例将起作用。

如果元素的值相等,则元素相等,而不是引用同一对象

这意味着CollectionAssert.Areequality使用Object.equals而不是Object.ReferenceEquals。根据Object.Equals的对象类型和实现,值将(而不是“可以”)用于比较

Object.Equals具有以下两种对象类型的默认行为(解释):

  • 如果值类型是相同的类型,并且它们的公共和私有字段具有相同的值,则它们是相等的
  • 当引用类型是同一对象时,它们是相等的。对于引用类型,对Equals的调用相当于对ReferenceEquals的调用。引用相等意味着对象变量引用同一个对象
在上面的代码示例中,断言失败,因为您创建了要插入两个列表中的不同对象。Areequal使用Object.Equals方法比较对象。仅当引用类型对象指向同一对象时,equals方法的默认实现才会返回true要比较这些对象的实际值,您需要覆盖TradeData的equals方法。

令人遗憾的是,对于CollectionAssert.AreEqual,有一种替代方法可以使用comparator,但对于CollectionAssert.Areequality,情况并非如此。

TradeData
需要覆盖
Equals
,否则只比较引用。我猜这很有意义,非常感谢!为了更直接地解释“如果元素的值相等,则元素相等,而不是它们引用同一对象”,MSDN试图解释集合的实例并不重要,而重要的是集合中的项。你的解释对这个案子绝对正确!