当前位置: 首页 > 知识库问答 >
问题:

局部函数与Lambda C#7.0

汤洋
2023-03-14

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

我确实理解lambda是匿名函数,而局部函数不是,但我无法理解一个真实场景,其中局部函数比lambda表达式具有优势

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

共有3个答案

董永宁
2023-03-14

如果您还想知道如何测试本地功能,那么应该检查JustMock,因为它具有相应的功能。下面是一个将要测试的简单类示例:

public class Foo // the class under test
{ 
    public int GetResult() 
    { 
        return 100 + GetLocal(); 
        int GetLocal () 
        { 
            return 42; 
        } 
    } 
}

以下是测试结果:

[TestClass] 
public class MockLocalFunctions 
{ 
    [TestMethod] 
    public void BasicUsage() 
    { 
        //Arrange 
        var foo = Mock.Create<Foo>(Behavior.CallOriginal); 
        Mock.Local.Function.Arrange<int>(foo, "GetResult", "GetLocal").DoNothing(); 

        //Act 
        var result = foo. GetResult(); 

        //Assert 
        Assert.AreEqual(100, result); 
    } 
} 

这里是到JustMock文档的链接。

免责声明。我是负责JustMock的开发人员之一。

冯通
2023-03-14

除了svick的伟大回答之外,局部函数还有一个优点:
它们可以在函数中的任何位置定义,即使在返回语句之后。

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;
}
唐兴发
2023-03-14

Mads Torgersen在C#设计会议笔记中对此进行了解释,其中首先讨论了局部功能:

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

进一步扩展,其优点是:

>

  • 性能

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

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

    这也意味着调用本地函数更便宜,并且可以内联,从而可能进一步提高性能。

    局部函数可以递归。

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

    本地函数可以是泛型的。

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

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

    lambda不能使用yield return(和yield break)关键字来实现IEnumerable

    本地功能看起来更好。

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

    比较:

    int add(int x, int y) => x + y;
    Func<int, int, int> add = (x, y) => x + y;
    

  •  类似资料:
    • 通过前面的学习我们知道, Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为 局部函数。 那么,局部函数有哪些特征,在使用时需要注意什么呢?接下来就给读者详细介绍 Python 局部函数的用法。 首先,和局部变量一样,默认情况下局部函数只能在其所在函数的作用域内使用。举个例

    • 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 使用局部变量 例7.3 使用局部变量 #!/usr/bin/python # Filename: func_local.py deffunc(x):     print'x is', x    

    • 问题内容: 在以下Python代码中,我得到了。据我了解,局部函数共享包含函数的局部变量,但是在这里似乎并非如此。我认识到在这种情况下这是一个不变的价值,但这应该不是问题。 似乎内部函数已收到父函数中所有引用的副本,因为如果的值包装在可变类型中,则不会收到异常。 有人可以在这里澄清行为,并为此指出合适的Python文档吗? 问题答案: 我相信您将其视为“可变性”问题是正确的。尽管您发布的代码确实引

    • 怎样使一个变量变成“局部”变量? 局部变量 如果变量用local来声明,那么它就只能够在该变量被声明的代码块中可见。 这个代码块就是局部范围。 在一个函数中,一个局部变量只有在函数代码中才有意义.[1] 例子 24-12. 局部变量的可见范围 #!/bin/bash # ex62.sh: 函数内部的局部变量与全局变量。 func () { local loc_var=23 #

    • 问题内容: 熊猫帮助文件说(用于eval): 为方便起见,可以使用多行字符串来执行多个分配。 但是,我发现这不适用于变量(使用ipython): 这有效: 但这不起作用(op,cl,hi,lo是数据帧df_price中的cols,其中mult是一个浮点数): 错误: pandas.computation.ops.UndefinedVariableError : 未定义局部变量“ mult” 问题答

    • 我在hdfs之上使用sparksql。 每个hdfs节点都运行一个spark从节点。 当我运行大型查询时,hdfs似乎在节点之间向spark从节点发送数据。 为什么hdfs不使用本地数据为本地spark提供服务? 所有任务都显示本地级别。 我甚至设置了spark.locality.wait=10000。 有什么遗漏或需要查看的吗? 谢谢,