Здравствуйте, vaa, Вы писали:
vaa>Здравствуйте, samius, Вы писали:
S>>Ниже пример того, что в замыкании участвует именно общая переменная, а не значение на момент определения замыкания. vaa>да, тупанул, действительно сложнее реализовать именно поведение лямбды
vaa>Получается через лямбда-синтаксис выразить лямбду невозможно?
Бррр...
В C#, раз речь о нем, лямбдой называется короткий способ записи функции. В базе любую функцию (на самом деле, нет), можно записать в виде лямбда выражения/оператора.
Что нельзя записать — функции, использующие unsafe, передачу параметров по ссылке и что-то еще. Здесь и сейчас это не важно. Для простоты будем считать, что любую.
С лямбдой на этом всё. Это способ записи, причем, мы всегда можем записать функцию по-другому. Например, delegate может описывать функции там же, где и лямбда.
Далее про лямбду можно забыть вовсе, она не интересна. Это просто сахар и только, у сахара нет поведения, которое можно наблюдать. Единственное, что мы можем наблюдать — так это то, что функция, записанная через лямбду, будет вести себя так же,как и функция, записанная делегатом или как-то еще.
Поэтому, выражение "через лямбда-синтаксис выразить лямбду" выгляидит (с точки зрения C#, повторюсь) как "через функцию выразить функцию". Что странно выглядит в одном утверждении со словом "невозможно".
Но если мы говорим о лямбда-исчислении и о том, что не всякую лямбду из лямбда-исчисления можно выразить в C#, то да, это справедливо. Но справедливо слишком, т.к. у нас разные системы типизации. Без конкретики сложно поддерживать беседу.
Далее интересно вот что: использует ли функция лишь свои переменные (локальные, параметры, или поля класса, в котором она определена), либо еще использует переменные, определенные где-то во внешнем лексическом контексте. Например, локальные переменные, которые определены в функции, которая определяла данную функцию в своем теле. Если такие переменные есть, то компилятор задействует технику "замыкание". На уровне кода это синтаксически никак не отражено. Нужно внимательно разобраться с областями видимости задействованных переменных, что бы понять, будет ли задействовано замыкание для использования некоторой переменной. Но это не точно. Компилятор может втащить в замыкание переменные, которые там не нужны.
В последнем параграфе для лямбды не нашлось места вовсе. Все, что справедливо для функций, будет справедливо и для лямбд (в рамках C#).