我昨天编写了一些单元测试,它们在 .NET 4.6.1 中通过但在 .NET core 3.0 中失败,因为在该测试期间生成的数组实例的数量在两种环境中是不同的。经过一番调查,结果发现用 LINQ 创建的空数组的数量是不同的。我终于能够将它转储到这个测试中:
[Test]
public void ArrayTest()
{
var numbers = Enumerable.Range(1, 5);
int[] items1 = numbers.Where(i => i > 5).ToArray();
int[] items2 = numbers.Where(i => i > 5).ToArray();
Assert.IsFalse(items1 == items2); // fails in .NET core 3 but passes in .NET 461
Assert.IsFalse(items1.Equals(items2)); // fails in .NET core 3 but passes in .NET 461
}
我的问题是:有谁知道实现的不同之处?如果集合没有元素,ToArray() 是否可能在 .NET 核心中返回一个 Array.Empty<> 单例实例,但在 .NET 中不返回?
最佳答案
Does ToArray() maybe return an Array.Empty<> singleton instance in .NET core but not in .NET if the collection has no elements?
是的。 Linq 在 .NET Core 中得到了很多速度优化。
在 .NET Framework 中,
Enumerable.ToArray()
调用 Buffer<TElement>.ToArray()
,返回 new TElement[0]
如果缓冲区为空。在 .NET Core 中,针对您的特定情况
<array>.Where(...).ToArray()
, Enumerable.ToArray()
调用 IIListProvider<TSource>.ToArray()
,由 WhereArrayIterator<TSource>.ToArray()
实现, 调用 new LargeArrayBuilder<TSource>(_source.Length)
, 其中 uses Array.Empty<T>
.
关于c# - 空数组 "Equals"的定义以及.NET和.NET core的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61520744/