c# - 空数组 "Equals"的定义以及.NET和.NET core的区别

标签 c# arrays .net-core

我昨天编写了一些单元测试,它们在 .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/

相关文章:

c# - 客户端。我如何接收大消息?

Java - 在类中添加支持以允许乘法

javascript - 迭代 JavaScript 对象数组元素

java - 使用回收器在 android Studio 中获取 NullPointerException

c# - .NET SSLStream : How to extract session key?

c# - 遵循 DDD 概念设计存储库

c# - VS 代码 : How to copy files to output directory depending on build configurations

c# - 用 C# 将所有 '\' 字符替换为 '/'

javascript - 使用 ajax 调用异步 web api 方法

javascript - 添加到数组兄弟