我可以依赖LINQ ToArray()总是返回一个新实例吗?

Joe*_*ite 21 .net linq toarray

我正在寻找一种简单的方法来克隆一个IEnumerable<T>参数供以后参考.LINQ的ToArray扩展方法似乎是一种很好,简洁的方法.

但是,我不清楚它是否总能保证返回一个新的数组实例.一些LINQ方法将检查可枚举的实际类型,并尽可能检查快捷方式; 例如,Count()将查看该方法是否实现ICollection<T>,如果是,将直接读取其Count属性; 如果必须,它只迭代集合.

鉴于实际上存在短路的心态,似乎如果我调用ToArray()已经数组的东西,ToArray()可能会短路并简单地返回相同的数组实例.这在技术上可以满足ToArray方法的要求.

从快速测试看来,在.NET 4.0中,调用ToArray()数组确实会返回一个新实例.我的问题是,我能依靠这个吗?我是否可以保证ToArray始终返回一个新实例,即使在Silverlight和.NET Framework的未来版本中也是如此?在这一点上是否有明确的文件?

Jon*_*eet 25

是的,ToArray总会返回一个新的数组 - 让它改变以返回一个现有的值将是一个可怕的突破性变化,我完全相信.NET团队不会这样做.能够依赖是一件很重要的事情.遗憾的是它没有记录:(

在LINQ to Objects中有许多微妙的行为,可能不值得依赖,但在这种情况下它是如此大量的行为,我会对它的改变感到惊讶.

当它不影响行为时,短路是很好的,但通常LINQ to Objects非常适合仅在有效情况下进行优化.你可能想看看我的Edulinq系列中关于优化的两篇 文章.


Cod*_*ike 16

由于ToArray方法是.NET框架的内部方法,因此我不会将自己的生命放在MS上,永远不会改变它.但是,我要做的是添加一个单元测试断言ToArray返回一个新的数组实例.

Assert.AreNotSame(myArray, myArray.ToArray());
Run Code Online (Sandbox Code Playgroud)

这样,如果您以后更改.NET框架版本,您将自动知道功能是否更改.