Здравствуйте, Sinix, Вы писали:
S>>>Roslyn team завела обсуждение на local functions (объявление функции внутри функции).
EP>>Это какие замыкания в C# по счёту? Третьи?
S>Угу. Лямбды, итераторы/await, локальные функции.
"итераторы/await" — это всё же не замыкания. Под замыканием я понимаю прежде все захват переменных из внешнего scope.
Вообще, под первыми замыканиями я имел в виду:
https://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx
int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };
// A reference to the outer variable n is said to be captured when the delegate is created.
// Unlike local variables, the lifetime of a captured variable extends until the delegates
// that reference the anonymous methods are eligible for garbage collection.
S>И, для ценителей, CreateDelegate + firstArgument:
Тут же нет захвата?
S>Если метод не вызывается миллионы раз. Каждый вызов — аллокация (если есть замыкания) + нет инлайнинга (в любом случае).
S>>>3. Перфоманс. Создание лямбды на каждый вызов, и, главное, отсутствие инлайнинга — не лучший способ добавить хелпер-код.
EP>>Казалось бы — почему бы не оптимизировать лямбды?
S>Потому что для делегатов в принципе инлайнинг не сделаешь. Разве что реврайтом при компиляции, но это по общим затратам сложнее, чем добавить local functions
А почему для лямбд это трудно, а для local functions нет? В чём разница? Лямбды завязаны на какое-то ABI jit'а?
S>>>* рекурсия
EP>>Пожалуй единственный аргумент за.
S>Неа, уже приводили вариант с рекурсией и делегатами.
Какой вариант? С захватом переменной лямбды и разделением объявления и инициализации? Да, но это же workaround. Причём существуют и другие — например приём self в качестве параметра.
S>Тут нет одного конкретного сильного аргумента, только в комплексе перевешивает.
S>В общем добавят — и фиг с ним. Обсуждение развели, как будто фича века
Если исправят скорость лямбд, то от этого выиграет уже существующий код.