Array.ToArray <>()是否返回原始数组(如果它是相同的类型)?

Cod*_*uth 40 c# linq extension-methods

我每天处理一个框架,我们有时提供接受IEnumerable<MyBusinessObject>作为参数的方法,以显示用户界面,执行计算等.

如果我传入一个MyBusinessObject像这样的数组:

MyBusinessObject[] myArray = new MyBusinessObject { obj1, obj2, ..., objN };
frameworkClass.MyMethod(myArray);

....

public class FrameworkClass
{
    public void MyMethod(IEnumerable<MyBusinessObject> objs)
    {
        // Other code that uses the enumerable
        MyBusinessObject[] objectArray = objs.ToArray();            
        // More code that uses the enumerable
    }
}
Run Code Online (Sandbox Code Playgroud)

该行objs.ToArray()只是简单地解析IEnumerable<MyBusinessObject>回原始数组,还是将它复制到一个全新的数组,准备好使用?

Nei*_*ell 57

不,您将始终获得数组的新副本,尽管其中的对象不是副本,它们与原始数组中的引用相同.

返回数组的更改有时会影响源,有时影响源,这将是非常不一致的.ToList出于同样的原因,同样的方式.


如果需要查看详细信息,可以检查源代码(截至2015年):Enumerable.ToArray,它依次创建内部Buffer类的元素副本(针对ICollection并进行优化Array[],但仍然进行复制).

  • @Codesleuth:查看[源代码](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs),`Count` 方法检查对象是否实现了`ICollection&lt;T&gt; ` 或 `ICollection`(这是一个数组)并使用它的 `Count` 属性而不是循环遍历项目。 (4认同)
  • 不得不向斯基特先生鞠躬致谢.就个人而言,我敢打赌它没有(IEnumerable没有Length属性).但是,它有可能为某些场景做一些聪明的反思,作为优化.点是,如果你想要计数,IEnumerable是不合适的--Illist <T>是. (2认同)

Ste*_*tze 8

如果数组中有一个或多个元素,您将获得该数组的一份新副本。对于空数组,您可能会得到相同的数组,至少在 .NET 5 中是这样:

Console.WriteLine(Object.ReferenceEquals(Array.Empty<string>(), Array.Empty<string>().ToArray()));
Run Code Online (Sandbox Code Playgroud)

这返回 true。

  • 很酷的发现。由于您无法附加到数组,因此这不太可能真正重要。但仍然很有趣! (3认同)