【发布时间】:2015-09-12 17:16:51
【问题描述】:
在浏览 .net 核心源代码时,我注意到即使是源代码形式的迭代器类也是手动实现的,而不是依赖于 yield 语句和自动 IEnumerable 实现。
您可以在这一行看到例如 where 迭代器 https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Enumerable.cs#L168 的声明和实现
我假设如果他们经历了这样做而不是简单的 yield 语句的麻烦,那么肯定会有一些好处,但我不能立即看到哪个,这似乎与我记得编译器自动执行的操作非常相似几年前我回顾了 eric lippert 的博客,我记得当我在早期天真地用 yield 语句重新实现 LINQ 以更好地理解它时,性能配置文件类似于 .NET 版本。
这激起了我的好奇心,但这也是一个非常重要的问题,因为我正处于一个相当大的数据中间 - 在内存项目中,如果我遗漏了一些明显可以使这种方法更好的东西,我很想知道权衡.
编辑:澄清一下,我确实理解为什么他们不能只在 where 方法中产生(不同容器类型的不同枚举),我不明白的是为什么他们实现迭代器本身(也就是说,而不是分叉到不同的迭代器,分叉到不同的方法,根据类型进行不同的迭代,并让步以自动实现状态机,而不是手动实现 case 1 goto 2 case 2 等)。
【问题讨论】:
标签: c# .net linq linq-to-objects .net-core