我正在查看 C# 7.0 中的新实现,我发现它们实现了本地函数很有趣,但我无法想象本地函数优于 lambda 表达式的场景,以及两者之间的区别是什么。
我确实知道 lambda 是anonymous函数,而本地函数不是,但我无法弄清楚真实世界的场景,其中本地函数比 lambda 表达式具有优势
anonymous
任何例子将不胜感激。谢谢。
Mads Torgersen 在 C# Design Meeting Notes 中对此进行了解释,其中首先讨论了本地函数:
你想要一个辅助函数。您仅在单个函数中使用它,并且它可能使用在该包含函数范围内的变量和类型参数。另一方面,与 lambda 不同的是,您不需要将它作为第一类对象,因此您不需要给它一个委托类型并分配一个实际的委托对象。此外,您可能希望它是递归的或通用的,或者将其实现为迭代器。
为了进一步扩展它,优点是:
创建 lambda 时,必须创建委托,在这种情况下这是不必要的分配。本地函数实际上只是函数,不需要委托。
此外,局部函数在捕获局部变量方面更有效:lambdas 通常将变量捕获到一个类中,而局部函数可以使用结构(使用传递ref),这再次避免了分配。
ref
这也意味着调用本地函数更便宜,它们可以内联,可能会进一步提高性能。
Lambdas 也可以是递归的,但它需要笨拙的代码,您首先分配null给委托变量,然后是 lambda。局部函数自然可以递归(包括相互递归)。
null
Lambda 不能是泛型的,因为它们必须分配给具有具体类型的变量(该类型可以使用外部范围的泛型变量,但这不是一回事)。
Lambda 不能使用yield return(and yield break) 关键字来实现IEnumerable<T>-returning 函数。本地函数可以。
yield return
yield break
IEnumerable<T>
这在上面的引用中没有提到,可能只是我个人的偏见,但我认为正常的函数语法看起来比将 lambda 分配给委托变量更好。局部函数也更简洁。
相比:
int add(int x, int y) => x + y; Func<int, int, int> add = (x, y) => x + y;