c# - 谁能解释这个枚举器语法?

标签 c# .net morelinq

public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action)
{    
    return _(); IEnumerable <T> _()
    {
        foreach (var element in source)
        {
            action(element);
            yield return element;
        }
    }
}

我在 MoreLinq 存储库中找到了这段代码,但无法理解这一行:

return _(); IEnumerable <T> _()

最佳答案

此代码使用了 C# 的一项相对较新的功能,称为 local function .这个函数唯一不同寻常的地方在于它的名字:开发人员为它使用了一个下划线。因此,函数的名称是 _ ,所以调用看起来像这样:_()

现在您知道了 return语句返回调用名为 _ 的本地函数的结果,其余的语法就位:

// This is a local function
IEnumerable <T> _() {
    ...
}

(OP's comment on the question) Can't we just do foreach with 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;
        }
    }
}

如果你输入 foreachyield return直接进入Pipe<T>的正文方法,参数检查将被推迟,直到你开始迭代你的 IEnumerable<T>结果。有了本地功能,您将尽快进行检查 Pipe<T>被调用,即使在调用者从不迭代结果的情况下也是如此。

关于c# - 谁能解释这个枚举器语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990969/

相关文章:

c# - 在编译时显示与 C# 中方法实现相关的自定义警告

C# - 使用 String.Split(CharArray) 时识别匹配字符

c# - C# 中的密集图形应用程序(使用 .NET/Mono)

c# - 需要帮助来使用表达式树构建 LINQ 查询

c# - 对象无法从 DBNull 转换为其他类型

c# - 选择 Distinct Count 真的很慢

c# - MoreLinq maxBy 与 LINQ max + where

c# - 如何分块化 IEnumerable<T>,而不会在失败时丢失/丢弃项目?

C# byte 与 int 短整数值

c# - 如何顺利开发C#/.NET的C库?