Замыкания в C # с лямбдами и анонимными методами - PullRequest
0 голосов
/ 27 сентября 2018

Я хотел бы задать вопрос, связанный с тем, что Closures поддерживает локальную переменную на основе двух примеров:

public static Func<int, int> F2()
{
    var local = 1;
    Func<int, int> inc = delegate (int x)
    {
        local = local + 1;
        return x + local;
    };
    return inc;
}

Теперь при вызове этого метода корректно работает рабочий механизм Closure

var inc2 = F2();
Console.WriteLine(inc2(10));
Console.WriteLine(inc2(10));

Результаты свывод:

12
13

Теперь, альтернативная версия:

public static Func<int, int> F1 = i =>
{
    var local = 1;
    Func<int, int> FInn = x =>
    {
        local++;
        return local + x;
    };
    return FInn(i);
};

Вызов этого:

    var inc1 = F1;
    Console.WriteLine(inc1(10));
    Console.WriteLine(inc1(10));

Отображает сейчас:

12
12

Почему вторая версия работает иначе, чем первая?

спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

В первом примере local инициализируется сверху, и внутренняя лямбда захватывает его.Вы возвращаете внутреннюю лямбду в вызывающий код, который включает захваченную переменную.

Во втором примере, каждый раз, когда вы вызываете F1, вы запускаете его с самого начала.Это означает, что вы каждый раз инициализируете переменную local равной 1.Затем вы сразу же выполняете внутренний FInn против него.


Для ясности: это не имеет ничего общего с первым примером, использующим делегат вместо более краткого лямбда-синтаксиса.Вы можете написать первый пример с inc, реализованным в виде лямбды вместо делегата, и вы все равно увидите эту разницу.

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