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.
Как-то так.