如果类型相同,Array.ToArray<>() 是否返回原始数组?
我每天都会处理一个框架,有时我们会提供接受 IEnumerable
作为参数的方法,以便显示用户界面、执行计算等。
如果我传入 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
解析回原始数组,还是将其复制到一个全新的数组,准备好使用了吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,您将总是获得数组的新副本,尽管其中的对象不是副本,但它们与原始数组中的引用相同。
对返回数组的更改有时会影响源,有时不会,这是非常不一致的。由于相同的原因,
ToList
的工作方式相同。如果需要查看详细信息,您可以检查源代码(截至 2015 年): Enumerable.ToArray 反过来使用内部 ICollection 进行了优化,因此针对
Array[]
进行了优化,但仍然进行复制) href="http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,f14dd065ac796f44,references" rel="noreferrer">缓冲区类。No, you will always get a new copy of the array, though the objects in it aren't copies, they are the same references as in the original array.
It would be very inconsistent for changes to the returned array to sometimes affect the source and sometimes not.
ToList
works the same way for the same reason.You can check source code (as of 2015) if you need to review details: Enumerable.ToArray which in turn creates copy of elements (optimized for
ICollection
and henceArray[]
, but still making copy) with internal Buffer class.如果数组中有一个或多个元素,您将获得数组的一个新副本。对于空数组,您可能会返回相同的数组,至少在 .NET 5 中:
这将返回 true。
You will get a new copy of the array if there is one or more element in it. For empty arrays, you might get the same array back, at least in .NET 5:
This returns true.