c# - 为什么要在 C# 中定义一个局部函数只是为了立即调用它(在 IEnumerable<T> 的上下文中)

标签 c# performance linq

<分区>

我看了天才的几种扩展方法的实现 MoreLINQ - 项目。我遇到了一种我无法解释的风格习惯。也许你们中的一些人可以?

它发生在例如 Pairwise.cs 中,引用如下。

那么为什么作者要编写一个名为_() 的局部函数只是为了在返回表达式中调用它呢?在函数中直接实现 yield return/yield break 不是很直接吗?我怀疑它与编译器从 yield 实现中生成 Enumerator 对象的方式有关。但我看不出有什么不同。 实际上什至发生了一些关闭事件 - 我认为那更糟(!?)
编辑:不,它不应该被关闭,因为它不是一个 lambda,而是一个局部函数,无论它们是什么,它只会获取外部作用域变量。

    public static IEnumerable<TResult> Pairwise<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> resultSelector)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (resultSelector == null) throw new ArgumentNullException(nameof(resultSelector));

        return _(); IEnumerable<TResult> _()
        {
            using (var e = source.GetEnumerator())
            {
                if (!e.MoveNext())
                    yield break;

                var previous = e.Current;
                while (e.MoveNext())
                {
                    yield return resultSelector(previous, e.Current);
                    previous = e.Current;
                }
            }
        }
    }

最佳答案

这是为了使参数验证变得急切,但允许使用 yield 编写方法的其余部分.有了它,您会在调用 Pairwise<TSource, TResult> 时得到与参数相关的异常。 .

如果没有它,您将在第一次调用 MoveNext 时遇到异常在返回的枚举器上。

关于c# - 为什么要在 C# 中定义一个局部函数只是为了立即调用它(在 IEnumerable<T> 的上下文中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54533438/

相关文章:

c# - 新的空白,非 null 匿名类型

javascript - Web API Controller 不尊重 CORS 来源

c# - FontSize.PIXELS c# 等价物

c# - LINQ - 如何更改 select 或 foreach 循环中的值?

mysql - 与数据库触发器相比,Hibernate 的拦截器效率如何?

iphone - 有没有办法强制核心动画运行它的线程?

c# - 如何在没有返回值的情况下从 Linq 语句调用函数?

c# - 是否可以手动向 SpeechClient 提供 GoogleCredential(在 .NET API 中)?

c# - 如何通过 Google Drive .NET API v3 使用服务帐户访问 Team Drive

c# - 什么时候并行提高性能