C# 什么样的支票收款资产
我在阅读MSDN中的方法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
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的调用。引用相等意味着对象变量引用同一个对象
TradeData
需要覆盖Equals
,否则只比较引用。我猜这很有意义,非常感谢!为了更直接地解释“如果元素的值相等,则元素相等,而不是它们引用同一对象”,MSDN试图解释集合的实例并不重要,而重要的是集合中的项。你的解释对这个案子绝对正确!