这里所指的是什么:return _()

36

我在MoreLinq中发现了这段代码,它在文件Batch.cs中(链接):

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

我了解了一下丢弃的相关知识,但以上代码仍然让我无法理解。当我悬停在第一个_上方时,它显示:“已捕获的变量:resultSelector、collection”。

  • 这两个_()代表什么意思?
  • 既然我们正在执行return _();,那么后续的代码IEnumerable<TResult> _()如何执行?
2个回答

34
这里的_()是调用本地函数_的语句。虽然不常见,但也是有效的。
本地函数与普通方法类似,但只能通过名称(即调用方法的常规方式)从声明它的方法内部进行调用(正如Eric在评论中指出的那样,还有一些其他的调用方式,比如通过从方法传递出去的委托),并且(除非装饰为static)它可以从声明方法中获取局部变量和参数作为状态。
在本例中,意图是执行及早的参数验证。 如果在迭代器块中放置验证代码,则参数验证将被推迟到第一次MoveNext()调用时进行。(例如,在尝试对数据进行foreach之前,它不会抱怨source为空)。

1
@MarcoSalerno 是的,但我想OP可能没有完全粘贴代码。 - Matthew Watson
有关“急切参数验证”的任何指针吗?我很难找到相关资源。我阅读了迭代器块的相关内容,但并没有清晰地看到它们之间的联系。 - Robotronx
1
@Robotron 试试这个:https://gist.github.com/mgravell/047f7fcfd2755819b8de7c5afaaf3001;这种差异可以更明显地显示出实际问题所在的位置;如果你在调用`foreach`之前通过几层未经验证的序列,那么发生错误的实际点可能很难追踪。 - Marc Gravell
1
@bracco23 "本地函数"; 没有规定它们不能在return之后声明。 - Marc Gravell
7
局部函数的特点在于它们的名称仅在声明的局部范围内有效,这使得它们成为局部函数。局部函数可以通过传递委托来从任何地方调用,例如。局部性是关于控制访问名称而不是所命名的东西的。 - Eric Lippert
显示剩余5条评论

1

IEnumerable<TResult> _() {} 是一个 本地函数,在 return _(); 中被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接