C#Local Functions与JavaScript嵌套函数有什么区别?

时间:2018-05-17 00:51:52

标签: javascript c# difference c#-7.0 nested-function

在C#中,本地函数是这样的:

public int MyFunction(int parameter)
{
     int local = 6;
     return MyLocalFunction(4);

     // Local Function
     int MyLocalFunction(int localFunctionParameter) => 42;
}

在JavaScript中,嵌套函数是:

function MyFunction(parameter) {
    var local = 6;
    return MyNestedFunction(4);

    // Nested Function
    function MyNestedFunction(localFunctionParameter) {
        return 42;
    }
}

除了语法之外,它们之间是否存在任何性能差异?

1 个答案:

答案 0 :(得分:3)

C#和JavaScript以不同方式处理它们的嵌套/本地函数。

通过您的示例,C#将编译此代码:

public int MyFunction(int parameter)
{
    int local = 6;
    return MyLocalFunction(4);

    // Local Function
    int MyLocalFunction(int localFunctionParameter) => 42;
}

进入此代码:

public int MyFunction(int parameter)
{
    int num = 6;
    return <MyFunction>g__MyLocalFunction|0_0(4);
}

[CompilerGenerated]
internal static int <MyFunction>g__MyLocalFunction|0_0(int localFunctionParameter)
{
    return 42;
}

正如您所看到的,<MyFunction>g__MyLocalFunction|0_0巧妙地不是“内部”MyFunction,只是在包含类中。我说,这使得它们与嵌套函数的根本不同之处不仅仅是它们的名称。但是,它确实阻止我们在父函数之外使用该局部函数,这实际上是最终目标。

JavaScript实际上每次调用时都会重新创建它的函数实例,这对性能不利,也不必要。我确实找到了一种方法来防止这种行为。您将获取JavaScript示例并将其重写为:

var MyFunction = (function(parameter) {

    return function(parameter) {
        var local = 6;
        MyNestedFunction(4);
    };

    function MyNestedFunction() {
        return 42;
    }
}());

对我来说这是笨重的,而不是我想要考虑本地/嵌套函数的方式。语法不像C#那样直观。

本地函数,因为它们最终会被移到类外,默认为从未被实例化两次的所需行为,因此它是两个世界中最好的。它具有更自然的语法和更好的性能(即使只是一点点)。