C# 7 – Локальные методы

C# logoИногда методы используются только в одном другом методе. Раньше, в этом случае, в класс добавлялся новый private метод, который доступен всему классу. В C# 7 есть возможность объявлять такие методы внутри самих методов, одновременно ограничивая их видимость.

Пример локальных методов::

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 (LocalFilter(element))
                yield return element;
        }

        // Демонстрация локального метода внутри локального метода,
        // а так же записи с использование выражения
        bool LocalFilter(T e) => filter(e);
    }
}

Ключевое отличие локальных методов от обычных: переменные из родительского метода доступны внутри локального (т.е. можно использовать замыкания).

Кроме того, стоит обратить внимание на следующие моменты:

  • Следствие замыканий: переменные внутри локального метода не могут иметь такие же имена как и у основного метода.
  • Внутри локального метода может быть объявлен свой локальный метод. При этом будут доступны все переменные из методов по цепочке "выше".
  • Локальный метод может быть записан в виде выражения.
  • У локального метода нет модификатора доступа, т.к. его область видимости равна коду метода, где он объявлен.

Удобнее всего записывать локальные методы после тела основного. Это не мешает чтению кода основного метода и позволяет использовать все его переменные в замыканиях.

Добавить комментарий