Как вы знаете, в C# 7.0 добавлено несколько новых функций Одной из них являются локальные функции. Я просмотрел несколько примеров и примеров использования локальных функций и нашел две причины их использования:
1) Скрыть функцию или метод. Причина в том, что если бы функция не была локальной, то другие члены могли бы случайно использовать напрямую
2) Использовать переменные функции «Родитель»
Во время отладки в рефакторинг кода Я не смог найти ссылки на локальные функции в Visual Studio. Есть ссылки на приватную функцию:
![private function](https://i.stack.imgur.com/mbI2H.png)
Помогает при отладке или рефакторинге кода. В локальных функциях я не смог их найти:
![local function](https://i.stack.imgur.com/Toos6.png)
Итак, первый вопрос: почему локальные функции не показывают сводные комментарии и ссылки?
Некоторым программистам нравилось использовать локальные функции, но некоторые нет. Вот пример (из Что нового в C# 7.0 |. NET Блог ):
public IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> filter)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (filter == null) throw new ArgumentNullException(nameof(filter));
return Iterator();
IEnumerable<T> Iterator()
{
foreach (var element in source)
{
if (filter(element)) { yield return element; }
}
}
}
В этом случае причина использования локальной функции:
Если бы Iterator
был закрытым методом рядом с Filter
, другие члены могли бы использовать его случайно (без проверки аргументов). Кроме того, потребовалось бы принять все те же аргументы, что и Filter
, вместо того, чтобы они просто находились в области видимости
Второй вопрос: почему мы должны использовать локальные функции? В этом случае мы можем просто удалить локальный метод, потому что он используется только один раз. если мы боимся размера кода или ответственности за код, мы можем использовать region :
public IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> filter)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (filter == null) throw new ArgumentNullException(nameof(filter));
#region Iterating
foreach (var element in source)
{
if (filter(element)) { yield return element; }
}
#endregion
}