Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

А как сейчас с работой?

07.10.21 12:42
Re: А как сейчас с работой?
 
MrSanders коренной житель

Во, нашёл самый простой (наверное) пример: https://www.simplethread.com/c-closures-explained/

public static Func<int,int> GetAFunc()
{
    var myVar = 1;
    Func<int, int> inc = delegate(int var1)
                            {
                                myVar = myVar + 1;
                                return var1 + myVar;
                            };
    return inc;
}

Вот где про него рассказывают можно посмотреть. Суть в том что в созданное замыкание для inc попадает не значение myVar а ссылка не него. В результате в самой лямбде мы не только можем поменять значение myVar (что тоже хреново - "незаметный" канал для обмена данными) но и если myVar поменяет значение снаружи лямбды, она радостно начнёт использовать новое значение.


В чём проблема? В незаметных и хрен пойми как возникающих ошибках. (напомню, что в функциональных языках вообще переменных "как бы нет", т.е. они есть, но только на крайний случай :))

Описал лямбду, погнал код дальше, и через 20 строк поменял значение переменной, которую в лямбде использовал. А потом где-то вызывается лямбда и вместо +1 увеличивает на 123. Ой.

 

Перейти на