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

发布于 2024-08-18 00:14:56 字数 722 浏览 8 评论 0 原文

我每天都会处理一个框架,有时我们会提供接受 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 解析回原始数组,还是将其复制到一个全新的数组,准备好使用了吗?

I deal with a framework on a daily basis where we sometimes provide methods that accept IEnumerable<MyBusinessObject> as a parameter in order to show user interfaces, perform calculations etc.

If I pass in an array of MyBusinessObject like so:

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
    }
}

Does the line objs.ToArray() simply resolve the IEnumerable<MyBusinessObject> back to the original array, or does it copy it to a whole new array, ready for use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只想待在家 2024-08-25 00:14:56

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

对返回数组的更改有时会影响源,有时不会,这是非常不一致的。由于相同的原因,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 hence Array[], but still making copy) with internal Buffer class.

生来就爱笑 2024-08-25 00:14:56

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

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

这将返回 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:

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

This returns true.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文