在C#中返回IEnumerable实例和yield return语句之间的确切区别是什么?

Nic*_*ico 9 c# ienumerable

目前我正在使用一些通过迭代器应用延迟执行的库.在某些情况下,我需要简单地"转发"收到的迭代器.即我必须IEnumerable<T>从被调用的方法获取实例并立即返回它.

现在我的问题是:简单地返回收到的IEnumerable<T>或通过循环重新产生它之间是否存在相关差异?

IEnumerable<int> GetByReturn()
{
    return GetIterator(); // GetIterator() returns IEnumerable<int>
}
// or:
IEnumerable<int> GetByReYielding()
{
    for(var item in GetIterator()) // GetIterator() returns IEnumerable<int>
    {
        yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ade 1

两者之间没有任何相关差异(除了性能之外,因为您没有对GetIterator(). 只有当您要对枚举器执行某些操作(例如过滤它)时,重新生成才有意义。