C#7.0中的本地函数与foreach或循环有何不同?

5
这是一个关于为什么的问题。以下是内容:
C# 7.0 添加了一个名为“本地函数”的新功能。以下是代码片段。
public int Fibonacci(int x)
{
    if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x));
    return Fib(x).current;

    (int current, int previous) Fib(int i)
    {
        if (i == 0) return (1, 0);
        var (p, pp) = Fib(i - 1);
        return (p + pp, p);
    }
}

我不理解的是,它在对同一方法进行递归调用。我们可以通过普通的foreach轻松实现这一点。那么为什么要使用本地函数? MSDN说:
作为迭代器实现的方法通常需要一个非迭代器包装器方法,以便在调用时急切地检查参数。(迭代器本身直到调用MoveNext才开始运行)。
需要帮助理解这个概念。

4
使用本地函数可以做许多事情,它不一定要是递归的。 - Zohar Peled
是的@ZoharPeled,但具体到递归,他们使用了这个例子,我想知道为什么?只是好奇。 - Pradip
名为Fibonacci的函数用于控制输入。本地函数Fib被用来封装逻辑的复杂代码,例如递归调用,而不必担心验证问题。由于是本地函数,您不能在未经验证的情况下调用Fib - Cleptus
1个回答

6

它正在对同一方法进行递归调用。我们可以通过普通的foreach轻松实现这一点。

这是两件不同的事情:尾递归(在方法本身的末尾调用自身)或迭代集合。它们并不总是可交换的,但它们可以用来实现相同的最终结果。

局部函数只是一个类方法,其作用域仅限于声明它的方法体中。

局部函数不仅有助于递归,还是防止在多个块中重复代码的简单方法。


我不认为“遍历集合”就是递归。而且尾递归也不仅仅是“方法调用自身”。 - Evk
@Evk 我同意,我正在寻找更好的方法来描述这个问题。欢迎提供建议。希望修改后可以更好。 - Patrick Hofman
本地函数本质上是一个类方法,其作用范围仅限于声明它的方法体内部。从C#的角度来看,它不仅仅是一个方法。就像Lambda已经能够做到的那样,本地函数也可以访问包含函数的局部变量。在CLR级别上,它当然仍然被翻译为一个方法。 - user743382
@hvd 委托可以做同样的事情。它不仅限于本地函数,但使用这些变量确实是一个很酷的功能。 - Patrick Hofman

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