Каковы различия между локальными функциями C # и вложенными функциями JavaScript? - PullRequest
0 голосов
/ 17 мая 2018

В 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 голосов
/ 17 мая 2018

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 #.

Локальные функции, потому что в конечном итоге они перемещаются за пределы класса, по умолчанию используется желаемое поведение, никогда не встречающееся дважды, так что это лучшее из обоих миров.У него более естественный синтаксис и лучшая производительность (пусть даже немного).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...