16 сентября 2017
Возможности C#
Иногда методы используются только в одном другом методе. Раньше, в этом случае, в класс добавлялся новый 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);
}
}
Ключевое отличие локальных методов от обычных: переменные из родительского метода доступны внутри локального (т.е. можно использовать замыкания).
Кроме того, стоит обратить внимание на следующие моменты:
- Следствие замыканий: переменные внутри локального метода не могут иметь такие же имена как и у основного метода.
- Внутри локального метода может быть объявлен свой локальный метод. При этом будут доступны все переменные из методов по цепочке "выше".
- Локальный метод может быть записан в виде выражения.
- У локального метода нет модификатора доступа, т.к. его область видимости равна коду метода, где он объявлен.
Удобнее всего записывать локальные методы после тела основного. Это не мешает чтению кода основного метода и позволяет использовать все его переменные в замыканиях.