Re[2]: [Ann, c#7] local functions
От: Sinix  
Дата: 22.05.15 09:26
Оценка: :)
Здравствуйте, 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>В каком смысле?
Следы редактирования Лишний пункт


S>>* рекурсия

EP>Пожалуй единственный аргумент за.
Неа, уже приводили вариант с рекурсией и делегатами. Тут нет одного конкретного сильного аргумента, только в комплексе перевешивает.
В общем добавят — и фиг с ним. Обсуждение развели, как будто фича века
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.