首页 > 解决方案 > C# 本地函数与 JavaScript 嵌套函数有什么区别?

问题描述

在 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;
    }
}

除了语法之外,它们两者之间是否有任何性能差异?

标签: javascriptc#differencec#-7.0nested-function

解决方案


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它巧妙地不在 "inside"MyFunction中,只是在包含类中。我想说,这使得它们与嵌套函数根本不同,不仅仅是它们的名字。但是,它确实阻止了我们在父函数之外使用该本地函数,而这确实是最终目标。

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

var MyFunction = (function(parameter) {

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

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

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

局部函数,因为它们最终会移出类,默认为永远不会被实例化两次的期望行为,所以它是两全其美的。它具有更自然的语法和更好的性能(即使只是一点点)。


推荐阅读