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

时间:2010-01-19 10:39:46

标签: 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
    }
}

objs.ToArray()是否只是将IEnumerable<MyBusinessObject>解析回原始数组,还是将其复制到一个全新的数组中,可以使用?

2 个答案:

答案 0 :(得分:54)

不,您将始终获取数组的新副本,但其中的对象不是副本,它们与原始数组中的引用相同。

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


如果您需要查看详细信息,可以查看源代码(截至2015年):Enumerable.ToArray然后创建元素副本(针对ICollection进行优化,从而Array[]优化制作副本)与内部Buffer class

答案 1 :(得分:3)

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

Console.WriteLine(Object.ReferenceEquals(Array.Empty<string>(), Array.Empty<string>().ToArray()));

这返回true。