本地函数与Lambda C#7.0
我期待在C#7.0中的新实现,我发现有趣的是,他们已经实现了本地函数,但我无法想象一个局部函数将优于lambdaexpression式,两者之间有什么区别。
我明白lambdas是anonymous
函数,而本地函数不是,但我不能找出一个真实世界的场景,其中本地函数比lambdaexpression式有优势
任何例子将不胜感激。 谢谢。
Mads Torgersen在C#devise会议笔记中解释了这个问题,首先讨论了地方function :
你想要一个帮手function。 你只在一个函数内使用它,它可能使用包含函数的范围内的variables和types参数。 另一方面,与lambda不同,你并不需要它作为第一类对象,所以你不需要给它一个委托types并分配一个实际的委托对象。 您也可能希望它是recursion或通用的,或者将其作为迭代器来实现。
为了进一步扩展,其优点是:
-
性能。
在创build一个lambda时,必须创build一个委托,在这种情况下这是一个不必要的分配。 本地function实际上只是function,没有代表是必要的。
此外,本地函数捕获局部variables的效率更高:lambdas通常捕获variables到一个类中,而本地函数可以使用一个结构(通过使用
ref
),这又避免了分配。这也意味着调用本地function更便宜,可以内联,可能进一步提高性能。
-
本地函数可以是recursion的。
Lambdas也可以是recursion的,但它需要笨拙的代码,首先将
null
分配给一个委托variables,然后是lambda。 本地函数自然可以recursion(包括相互recursion)。 -
本地function可以是通用的。
Lambdas不能是通用的,因为它们必须被分配给一个具体types的variables(该types可以使用来自外部范围的genericsvariables,但这不是一回事)。
-
本地函数可以作为迭代器来实现。
Lambdas不能使用
yield return
(和yield break
)关键字来实现IEnumerable<T>
-returning函数。 本地function可以。 -
本地function看起来更好。
这在上面的引用中没有提到,可能只是我个人的偏见,但我认为正常的函数语法看起来比分配一个lambda到一个委托variables更好。 本地function也更加简洁。
比较:
int add(int x, int y) => x + y; Func<int, int, int> add = (x, y) => x + y;
除了svick伟大的答案,还有一个本地function的优势:
它们可以在函数的任何地方定义,甚至在return
语句之后。
public double DoMath(double a, double b) { var resultA = f(a); var resultB = f(b); return resultA + resultB; double f(double x) => 5 * x + 3; }