1

.Net 中 Enumerable.Range 的精确实现是什么?更可取的.Net 4?它是一个产生的for循环吗?自定义实现(IEnumerable、IEnumerator)还是?

4

4 回答 4

1

您可以使用Reflector自己查看实现。它在调用时检查参数并抛出异常,因此Range方法本身不是迭代器方法。它调用另一个方法,即迭代器方法。由于许可证限制,不能发布确切的代码。

于 2009-10-05T13:45:35.160 回答
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 回答