asm*_*smo 9 linq foreach select iterator
1)这些生成相同的字节代码吗?
2)如果没有,在某些情况下使用一个是否有任何收益?
// LINQ select statement
return from item in collection
select item.Property;
// foreach in an iterator block
foreach (item in collection)
yield return item.Property;
Run Code Online (Sandbox Code Playgroud)
它们不会生成相同的代码,但归结为相同的东西,你得到一个对象实现IEnumerable<typeof(Property)>.不同之处在于linq从其库中提供了迭代器(在这种情况下最有可能通过使用WhereSelectArrayIterator或WhereSelectListIterator),而在第二个示例中,您自己生成一个解析集合的迭代器块.迭代器块方法总是通过编译器魔术的方式编译为一个单独的类实现IEnumerable<typeof(yield)>,当您调用迭代器块方法时,它实际上没有看到,而是隐式实例化.
性能方面,对于可索引的集合,#1应该稍微(但只是略微)更快,因为当您遍历结果时,IEnumerable您将直接从foreach进入优化的linq迭代器中的集合检索.在示例#2中,您从foreach进入迭代器块的foreach并从那里进入集合检索,您的性能主要取决于编译器在优化yield逻辑方面的智能程度.在任何情况下,我都会想到,对于任何复杂的收集机制,检索成本都会使这种差异边缘化.
恕我直言,我总是选择#1,如果没有别的东西,它可以让我不必为了迭代而编写一个单独的方法.
| 归档时间: |
|
| 查看次数: |
9285 次 |
| 最近记录: |