Вот в этом вопросе поднимается вопрос о планируемых нововведения в c# версии 7.
В частности меня заинтересовали так называемые локальные функции.
В ответе @VladD есть пример как может быть использована локальная функция:
IEnumerable<int> GetOdd(IEnumerable<int> s)
{
if (s == null)
throw new ArgumentNullException();
// обратите внимание, `Inner` без параметров
IEnumerable<int> Inner()
{
foreach (var v in s)
if (v % 2 != 0)
yield return v;
}
return Inner();
}
но мне кажется данный пример слегка натянутым, в данном случае можно было бы наверно и обойтись без функции Inner().
Так же мне непонятно следующее высказывание:
По поводу локальных функций, мне кажется, часто, наоборот, приватные функции классов используются как костыль на отсутствие локальных функций. Часто в приватную функцию выносится хелпер из одной функции, не имеющий значения внутри класса. Локальная функция — более правильный путь для таких функций.
У себя в коде я оформляю отдельными методами код на основании следующих правил:
- Функционал который может быть повторно использован;
- Вынесения функционала в отдельный метод что бы поддерживать стройность функции;
- Прочее
Например:
public IEnumerable<string> GetPhonesForNotice(requestId)
{
var requestState = GetStateOfRequest(int requestId);
switch(requestState)
{
case "Открыта":
{
return getRecipientsForNewRequest(int requestId);
break;
}
case "Закрыта":
{
return getRecipientsForClosedRequest(int requestId);
break;
}
}
}
private IEnumerable<string> getRecipientsForNewRequest(int requestId)
{
}
private IEnumerable<string> getRecipientsForClosedRequest(int requestId)
{
}
Если я правильно понял то тогда в новой версии языка функции getRecipientsForNewRequest(int requestId), getRecipientsForClosedRequest(int requestId) можно будет реализовать внутри главной функции GetPhonesForNotice(int requestId) но я не понимаю чем это правильней/лучше текущего варианта?
Sortлокальные функции будут отличаться от внутренних делегатов? – Grundy Jul 02 '16 at 17:06yield return. Ну и делегат — это класс-обёртка над функцией, он менее эффективен. – VladD Jul 02 '16 at 23:44list.Sort(ascending ? (a,b)=>a.Compare(b) : (a,b)=>b.Compare(a));, с рекурсией тоже проблем нет - даешь имя делегату и вполне можешь его использовать, а с остальным да и плюсref/outпараметры – Grundy Jul 03 '16 at 06:33Func<int, int> f = null; f = (n => n == 0 ? 0 : 1 + f(n - 1)); var g = f; if (negative) f = (n => n == 0 ? 0 : -1 + f(n + 1)); g(1);– VladD Jul 03 '16 at 11:16