Здравствуйте, Evgeny.Panasyuk, Вы писали:
S>>Roslyn team завела обсуждение на local functions (объявление функции внутри функции).
EP>Это какие замыкания в C# по счёту? Третьи?
Угу. Лямбды, итераторы/await, локальные функции. И, для ценителей,
CreateDelegate + firstArgument:
public static void Do(string a, int b)
{
for (int i = 0; i < b; i++)
{
Console.WriteLine(a);
}
}
static void Main()
{
Action<int> a = (Action<int>)Delegate.CreateDelegate(
typeof(Action<int>),
"hello",
typeof(Program).GetMethod("Do"));
a(10);
Console.Write("Done.");
Console.ReadKey();
}
S>>1. Упрощает код — не всегда очевидно, что функция — просто хелпер для одного конкретного метода и вызывать её не по делу не надо.
EP>Для этого достаточно лямбды.
Если метод не вызывается миллионы раз. Каждый вызов — аллокация (если есть замыкания) + нет инлайнинга (в любом случае).
S>>2. лямбды не умеют в yield return. Т.е. самый простой с валидацией аргументов превращается в
EP>В чём проблема добавить?
S>>3. Перфоманс. Создание лямбды на каждый вызов, и, главное, отсутствие инлайнинга — не лучший способ добавить хелпер-код.
EP>Казалось бы — почему бы не оптимизировать лямбды?
Потому что для делегатов в принципе инлайнинг не сделаешь. Разве что реврайтом при компиляции, но это по общим затратам сложнее, чем добавить local functions
S>>4. Чтоб было совсем весело, в этого ужеежа запихнули фичи и от лямбд и от "обычных" методов:
S>>* local functions могут вести себя как лямбды
EP>В каком смысле?
Следы редактирования
![](/Forum/Images/smile.gif)
Лишний пункт
S>>* рекурсия
EP>Пожалуй единственный аргумент за.
Неа, уже приводили вариант с рекурсией и делегатами. Тут нет одного конкретного сильного аргумента, только в комплексе перевешивает.
В общем добавят — и фиг с ним. Обсуждение развели, как будто фича века