本地函数与Lambda C#7.0

我期待在C#7.0中的新实现,我发现有趣的是,他们已经实现了本地函数,但我无法想象一个局部函数将优于lambdaexpression式,两者之间有什么区别。

我明白lambdas是anonymous函数,而本地函数不是,但我不能找出一个真实世界的场景,其中本地函数比lambdaexpression式有优势

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

Mads Torgersen在C#devise会议笔记中解释了这个问题,首先讨论了地方function :

你想要一个帮手function。 你只在一个函数内使用它,它可能使用包含函数的范围内的variables和types参数。 另一方面,与lambda不同,你并不需要它作为第一类对象,所以你不需要给它一个委托types并分配一个实际的委托对象。 您也可能希望它是recursion或通用的,或者将其作为迭代器来实现。

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

  1. 性能。

    在创build一个lambda时,必须创build一个委托,在这种情况下这是一个不必要的分配。 本地function实际上只是function,没有代表是必要的。

    此外,本地函数捕获局部variables的效率更高:lambdas通常捕获variables到一个类中,而本地函数可以使用一个结构(通过使用ref ),这又避免了分配。

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

  2. 本地函数可以是recursion的。

    Lambdas也可以是recursion的,但它需要笨拙的代码,首先将null分配给一个委托variables,然后是lambda。 本地函数自然可以recursion(包括相互recursion)。

  3. 本地function可以是通用的。

    Lambdas不能是通用的,因为它们必须被分配给一个具体types的variables(该types可以使用来自外部范围的genericsvariables,但这不是一回事)。

  4. 本地函数可以作为迭代器来实现。

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

  5. 本地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; }