ToArray
由于一个简单的原因,您将找不到有关方法可能异常的文档。这是一种具有许多“重载”的扩展方法。它们都具有相同的方法签名,但是对于不同的集合类型(例如List<T>
和HashSet<T>
.
但是,我们可以对大多数代码做出一个安全的假设,即 .NET 框架 BCL 出于性能原因不执行任何锁定。我还非常具体地检查了ToList
for的实现List<T>
。
public T[] ToArray()
{
T[] array = new T[this._size];
Array.Copy(this._items, 0, array, 0, this._size);
return array;
}
正如您可能已经想象的那样,这是一个非常简单的代码,最终在mscorlib
. 对于此特定实现,您还可以在 MSDN 页面中查看 Array.Copy 方法可能出现的异常。它归结为一个异常,如果列表的等级在刚刚分配目标数组后立即发生变化,则会引发异常。
记住这List<T>
是一个简单的例子,您可以想象在需要更复杂代码才能存储在数组中的结构上出现异常的机会会增加。的实现Queue<T>
是一个更可能失败的候选者:
public T[] ToArray()
{
T[] array = new T[this._size];
if (this._size == 0)
{
return array;
}
if (this._head < this._tail)
{
Array.Copy(this._array, this._head, array, 0, this._size);
}
else
{
Array.Copy(this._array, this._head, array, 0, this._array.Length - this._head);
Array.Copy(this._array, 0, array, this._array.Length - this._head, this._tail);
}
return array;
}