我每天处理一个框架,我们有时会提供接受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>
解析回原始数组,还是将其复制到一个全新的数组中,可以使用?
答案 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。