Enumerable.Range实现

时间:2009-10-05 13:39:07

标签: .net ienumerable implementation range

.Net中Enumerable.Range的精确实现是什么;首选.Net 4?它是一个屈服于循环的吗?自定义实现(IEnumerable,IEnumerator)或?

4 个答案:

答案 0 :(得分:1)

您可以使用Reflector查看自己的实施情况。它在调用时检查参数并抛出异常,因此Range方法本身不是迭代器方法。它调用另一个方法,它是一个迭代器方法。由于license restrictions而发布确切代码并不合适。

答案 1 :(得分:1)

accepted answer上的question应该会给您答案:

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中的代码可以为您提供更多信息。

答案 2 :(得分:1)

Reflector输出中的一个轻微但显着的差异(以及CraigTP的答案及其评论中提到的参数检查和内部化的额外水平):

public static IEnumerable<int> Range(int start, int count) {
    for(int current = 0; current < count; ++current) {
        yield return start + current;
    }
}

也就是说,它们代替另一个局部变量,为每个产量应用额外的添加。

答案 3 :(得分:0)

.NET 4

2014年2月,Microsoft put a .NET Source Code browser online。因此,您的问题现在可以通过官方来源得到解答:

Enumerable.Range使用自定义迭代器

license仍然不允许在此处发布代码,但是您可以在以下链接中自行查看:


.NET Core

.NET Core是根据更宽松的MIT许可证授权的。我不是律师,所以我不知道这是否意味着我可以将其复制并粘贴到StackOverflow,但这是其Enumerable.Range实现的直接链接: