Re[3]: [Ann, c#7] local functions
От: Evgeny.Panasyuk Россия  
Дата: 22.05.15 10:00
Оценка: 36 (1) +1
Здравствуйте, 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>В общем добавят — и фиг с ним. Обсуждение развели, как будто фича века

Если исправят скорость лямбд, то от этого выиграет уже существующий код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.