Підрозділ 2.22
Локальні функції
Розглядає локальні функції всередині методів, їх область видимості, доступ до змінних і статичні локальні функції.
2.22. Локальні функції
Локальна функція — це функція, оголошена безпосередньо всередині іншого методу. Вона існує і видима виключно в межах того методу, де оголошена, і не може бути викликана ззовні. Локальні функції вирішують конкретну проблему: дозволяють виокремити фрагмент логіки у власний іменований блок, не виносячи його у простір імен класу як окремий метод. Це корисно тоді, коли певна допоміжна операція потрібна лише в одному місці і немає сенсу робити її частиною публічного або навіть приватного API класу.
Навіщо потрібні локальні функції
Розглянемо метод, який аналізує результати аналізів пацієнта і перевіряє кілька показників. Без локальної функції повторювана логіка перевірки дублюється:
Логіка "Низький" / "Норма" / "Високий" повторюється тричі. Локальна функція усуває це дублювання, залишаючи код лише всередині методу:
Локальна функція Classify визначена після того, як використовується — у C# порядок оголошення всередині методу не має значення. Вона видима у всьому тілі методу AnalyzeBloodTest, але абсолютно невидима ззовні.

Доступ до змінних зовнішнього методу
Звичайна (нестатична) локальна функція має доступ до змінних і параметрів методу, всередині якого вона визначена. Ці змінні можна читати і змінювати без явної передачі як параметри:
Функція PrintSection читає змінну header зовнішнього методу напряму. Це зручно, але вимагає уваги: локальна функція може ненавмисно змінити змінні зовнішнього контексту, що ускладнює розуміння коду.
Статичні локальні функції
Щоб гарантовано заборонити локальній функції звертатися до змінних зовнішнього методу, її можна оголосити зі словом static. Статична локальна функція ізольована: вона бачить лише те, що отримує через свої параметри. Будь-яка спроба звернутися до змінної зовнішнього методу всередині статичної локальної функції — це помилка компіляції.

Перевага static локальної функції — явна гарантія ізольованості. Читаючи сигнатуру static string Classify(...), розробник одразу розуміє: ця функція не має прихованих побічних ефектів через захоплені змінні, її поведінка визначається лише аргументами. Це робить код передбачуваним і простішим для тестування.
Локальні функції проти приватних методів
Локальна функція і приватний метод класу вирішують схожу задачу — ізоляція допоміжної логіки — але мають різну область застосування:
- Приватний метод доступний усьому класу. Використовуйте його, якщо допоміжна логіка може знадобитися кільком методам класу.
- Локальна функція доступна лише одному методу. Використовуйте її, якщо логіка потрібна виключно в одному місці і виносити її в клас означало б штучно розширювати API.
Локальні функції також корисні для покращення читабельності складних методів: замість того щоб читати 80 рядків коду підряд, читач бачить короткий метод з виразними викликами іменованих локальних функцій і занурюється в деталі лише за потреби.