.Net 中 Enumerable.Range 的精确实现是什么?更可取的.Net 4?它是一个产生的for循环吗?自定义实现(IEnumerable、IEnumerator)还是?
问问题
2314 次
4 回答
1
public static class Enumerable {
public static IEnumerable<int> Range(int start, int count) {
var end = start + count;
for(var current = start; current < end; ++current) {
yield return current;
}
}
}
这不是确切的代码,因为在方法中进行了很多错误检查等Range
,并且在内部,它调用了其他方法,但是,上面引用的代码是Range
例程的“本质”。
检查Reflector中的代码应该会为您提供更多信息。
于 2009-10-05T13:57:44.220 回答
1
反射器输出(以及 CraigTP 的答案及其评论中提到的参数检查和额外的内部化水平)略有但显着的差异:
public static IEnumerable<int> Range(int start, int count) {
for(int current = 0; current < count; ++current) {
yield return start + current;
}
}
也就是说,它们不是另一个局部变量,而是为每个产量应用一个额外的加法。
于 2010-05-28T14:59:15.057 回答
1
它是一个产生的for循环吗?自定义实现(IEnumerable、IEnumerator)?
两个都 :-)
.NET 4
2014 年 2 月,微软将 .NET Source Code 浏览器上线。因此,您的问题现在可以通过官方来源回答:
Enumerable.Range
执行错误检查,然后调用私有方法RangeIterator
,该方法使用产生的 for 循环。
许可证仍然不允许在此处发布代码,但您可以在此链接中自己查看:
.NET 核心
.NET Core 在更宽松的 MIT 许可下获得许可。我不是律师,所以我不知道这是否意味着我可以将其复制并粘贴到 StackOverflow,但这是他们Enumerable.Range
实现的直接链接,它使用自定义 RangeIterator 对象:
于 2019-05-02T16:13:29.350 回答