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

除了语法之外,两者之间在性能上有什么区别吗?

解决方法:

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#那样直观.

局部函数由于最终会移到类之外,因此默认为从不被两次实例化的期望行为,因此这是两全其美的方法.它具有更自然的语法和更好的性能(即使只是一点点).

上一篇:Java方法多态性——方法的重载Overload和重写Override


下一篇:java-具有嵌套在对象中的type属性的Jackson多态反序列化