小编典典

本地函数与 Lambda C# 7.0

all

我正在查看 C# 7.0 中的新实现,我发现它们实现了本地函数很有趣,但我无法想象本地函数优于 lambda
表达式的场景,以及两者之间的区别是什么。

我确实知道 lambda 是anonymous函数,而本地函数不是,但我无法弄清楚真实世界的场景,其中本地函数比 lambda 表达式具有优势

任何例子将不胜感激。谢谢。


阅读 60

收藏
2022-06-21

共1个答案

小编典典

Mads Torgersen 在 C# Design Meeting Notes
中对此进行了解释,其中首先讨论了本地函数

你想要一个辅助函数。您仅在单个函数中使用它,并且它可能使用在该包含函数范围内的变量和类型参数。另一方面,与 lambda
不同的是,您不需要将它作为第一类对象,因此您不需要给它一个委托类型并分配一个实际的委托对象。此外,您可能希望它是递归的或通用的,或者将其实现为迭代器。

为了进一步扩展它,优点是:

  1. 表现。

创建 lambda 时,必须创建委托,在这种情况下这是不必要的分配。本地函数实际上只是函数,不需要委托。

此外,局部函数在捕获局部变量方面更有效:lambdas 通常将变量捕获到一个类中,而局部函数可以使用结构(使用传递ref),这再次避免了分配。

这也意味着调用本地函数更便宜,它们可以内联,可能会进一步提高性能。

  1. 局部函数可以是递归的。

Lambdas 也可以是递归的,但它需要笨拙的代码,您首先分配null给委托变量,然后是 lambda。局部函数自然可以递归(包括相互递归)。

  1. 局部函数可以是通用的。

Lambda 不能是泛型的,因为它们必须分配给具有具体类型的变量(该类型可以使用外部范围的泛型变量,但这不是一回事)。

  1. 局部函数可以实现为迭代器。

Lambda 不能使用yield return(and yield break) 关键字来实现IEnumerable<T>-returning
函数。本地函数可以。

  1. 局部函数看起来更好。

这在上面的引用中没有提到,可能只是我个人的偏见,但我认为正常的函数语法看起来比将 lambda 分配给委托变量更好。局部函数也更简洁。

相比:

    int add(int x, int y) => x + y;
Func<int, int, int> add = (x, y) => x + y;
2022-06-21