[Ann, c#7] local functions
От: Sinix  
Дата: 20.05.15 07:18
Оценка: 285 (12) +3
Roslyn team завела обсуждение на local functions (объявление функции внутри функции).
Пока обсуждение чисто техническое, комментарии от c# team/vb team выложат пожже. У кого есть желание — участвуйте

Зачем оно надо:


В принципе, особого смысла объявлять метод внутри метода нет. В большинстве случаев можно положить private-метод рядом, если припёрло —
Func<int> x = ()=> { return 42; };
...
var y = x();

и вперёд.

Официальные комментарии такие:

1. Упрощает код — не всегда очевидно, что функция — просто хелпер для одного конкретного метода и вызывать её не по делу не надо.
2. лямбды не умеют в yield return. Т.е. самый простой с валидацией аргументов превращается в
public IEnumerable<char> GetChars(int count)
{
  if (count < 0) throw something;

  return GetCharsCore(count);
}

private IEnumerable<char> GetCharsCore(int count)
{
  for (int i = 0; i<count; i++) yield return 'a';
}

вместо
public IEnumerable<char> GetChars(int count)
{
  IEnumerable<char> GetCharsCore(int count)
  {
    for (int i = 0; i<count; i++) yield return 'a';
  }

  if (count < 0) throw something;

  return GetCharsCore(count);
}


3. Перфоманс. Создание лямбды на каждый вызов, и, главное, отсутствие инлайнинга — не лучший способ добавить хелпер-код.

4. Чтоб было совсем весело, в этого ужеежа запихнули фичи и от лямбд и от "обычных" методов:
* local functions могут вести себя как лямбды
* вывод типа для результата (если нет рекурсии)
* рекурсия (если не используется вывод типа. и не говорите мне, что это тоже рекурсия).
* захват переменных (aka lambda closures)
* ref/out — параметры, named args, default arg values etc.

Как-то так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.