这段代码使用了 C# 的一个相对较新的特性,称为本地函数。这个函数唯一不寻常的是它的名字:开发人员使用了一个下划线。因此,函数的名称是_
,所以调用看起来像这样:_()
既然您知道该return
语句返回调用名为 的本地函数的结果,_
那么语法的其余部分就到位了:
// This is a local function
IEnumerable <T> _() {
...
}
(OP对这个问题的评论)我们不能只做foreach
吗yield return
?
您复制的方法包括另外两行,这是理解差异的关键:
public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (action == null) throw new ArgumentNullException(nameof(action));
return _(); IEnumerable <T> _()
{
foreach (var element in source)
{
action(element);
yield return element;
}
}
}
如果您将foreach
withyield return
直接放入Pipe<T>
方法体中,则参数检查将被推迟,直到您开始迭代IEnumerable<T>
结果。使用本地函数,您将在调用时立即进行检查Pipe<T>
,即使在调用者从不迭代结果的情况下也是如此。