.NET Framework 4.8与.NET 7中数组比较结果差异的技术疑问
数组比较在.NET Framework 4.8与.NET 7中的差异解析
.NET Framework 4.8 代码行为
List<myObject> _myList = new List<myObject>(); _myList.ToArray() == _myList.ToArray() // 返回 false
.NET 7 代码行为
List<myObject> _myList = new List<myObject>(); _myList.ToArray() == _myList.ToArray() // 返回 true
差异合理性说明
这个差异是完全合理的,核心源于.NET 对数组==运算符的实现变更:
- 在.NET Framework 及早期.NET Core版本中,数组作为引用类型,
==运算符默认比较的是对象的内存引用地址。每次调用ToArray()都会生成全新的数组实例,内存地址不同,因此返回false。 - 从.NET Core 3.0开始(包含.NET 5/6/7等后续版本),.NET 优化了一维数组的
==运算符逻辑:当比较的是相同类型的一维数组时,会自动转为比较数组的内容是否完全匹配(效果等价于调用Enumerable.SequenceEqual())。空数组的内容完全一致,所以返回true。
需要注意:该优化仅适用于一维数组,多维数组的==仍会比较引用地址;如果myObject是自定义引用类型,只有当数组中对应位置的元素都满足==相等时,数组比较才会返回true。
内容的提问来源于stack exchange,提问作者Salvador Nasser
相关产品推荐
相关产品推荐

