【发布时间】:2014-01-27 13:39:13
【问题描述】:
在 StackOverflow 中,ICollection(或派生自 ICollection<T> 的类)的 ToList() 扩展方法有很多用法。
我已经拿出了很好的反编译器来看看ToList()扩展方法是如何执行的,它是否随时枚举集合。通过我遇到的来源:
[__DynamicallyInvokable]
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
return new List<TSource>(source);
}
现在这很简单,所以ToList() 扩展方法只是用源对象创建一个新的List<T>。深入挖掘 List 构造函数会显示这一行。
ICollection<T> ts = collection as ICollection<T>;
//.. ommited code
ts.CopyTo(this._items, 0);
如您所愿,您将深入研究CopyTo 方法。这就是我卡住的地方。在对方法调用进行了所有挖掘之后,我们得到了最终的 extern 方法调用
[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
[SecurityCritical]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
我的问题是(虽然我似乎找不到)ToList() 扩展方法 (ICollection<T>.CopyTo()) 在执行时会遍历集合(数组)的所有对象吗?
子问题:在哪里可以找到上述extern void Copy() 的来源?
编辑:我已经直接编辑了这个问题,因为我意识到我正在尝试获取接口规范而不是实现。对不起
【问题讨论】:
-
我想我可能需要重新表述这个问题,因为它应该专门讨论 ToList() 函数..
-
我已经稍微更新了我的答案来说明这一点,因为你打电话给
ToList()真的很重要。
标签: c# icollection