Объявление локальных функций
Определяйте вспомогательные функции внутри методов.
«Объявление локальных функций» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Что такое локальная функция
Локальная функция — это метод, объявленный внутри другого метода. Она видна только в содержащем её члене, поэтому вспомогательная логика остаётся рядом с местом использования и не добавляется к интерфейсу класса.
Объявление локальной функции
Запишите локальную функцию как обычный метод, вложив её в тело метода. В пределах одной области видимости её можно вызвать до или после объявления.
using System;
public class Program
{
public static void Main()
{
int Square(int n) => n * n;
Console.WriteLine(Square(4));
Console.WriteLine(Square(7));
}
}Локальные функции с блочным телом
Локальные функции могут иметь полноценное блочное тело с несколькими инструкциями, циклами и собственными локальными переменными, как и любой метод.
using System;
public class Program
{
public static void Main()
{
int Factorial(int n)
{
int result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
Console.WriteLine(Factorial(5));
}
}Повышение понятности кода
Локальные функции позволяют дать имя фрагменту логики, не загромождая класс закрытым методом, который используется только одним методом. Это сохраняет связанный код вместе.
using System;
public class Program
{
public static void Main()
{
string Format(string label, int value) => label + ": " + value;
Console.WriteLine(Format("Score", 90));
Console.WriteLine(Format("Level", 3));
}
}Рекурсия с локальными функциями
Локальная функция может вызывать саму себя, поэтому рекурсию легко выразить прямо в нужном месте.
using System;
public class Program
{
public static void Main()
{
int Fib(int n) => n < 2 ? n : Fib(n - 1) + Fib(n - 2);
for (int i = 0; i < 7; i++)
Console.Write(Fib(i) + " ");
Console.WriteLine();
}
}Локальные функции можно объявлять после использования
В отличие от локальных переменных, на локальную функцию можно сослаться раньше в методе, чем она объявлена. Компилятор разрешает ссылки во всей содержащей её области видимости.
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(Greet("Ada")); // used before declared
string Greet(string name) => "Hello, " + name;
}
}Параметры и возвращаемые типы
Локальные функции поддерживают всё, что и обычные методы: несколько параметров, возвращаемые значения, параметры ref и out, а также обобщения.
using System;
public class Program
{
public static void Main()
{
bool TryHalve(int n, out int half)
{
half = n / 2;
return n % 2 == 0;
}
if (TryHalve(10, out int result))
Console.WriteLine("half is " + result);
}
}Обобщённые локальные функции
Локальная функция может быть обобщённой и иметь собственные параметры типов, независимые от содержащего её метода.
using System;
public class Program
{
public static void Main()
{
T Echo<T>(T value)
{
Console.WriteLine("echoing " + value);
return value;
}
int n = Echo(42);
string s = Echo("hi");
Console.WriteLine(n + " " + s);
}
}Вложенные локальные функции
Локальные функции сами могут содержать локальные функции. Вложенные функции видны только внутри родительской функции, что позволяет создавать вспомогательные уровни с узкой областью видимости.
using System;
public class Program
{
public static void Main()
{
int Compute(int x)
{
int Double(int n) => n * 2;
int AddOne(int n) => n + 1;
return Double(AddOne(x));
}
Console.WriteLine(Compute(5));
}
}Локальные функции для проверки аргументов
Распространённый шаблон: сразу проверить аргументы, а затем передать основную работу локальной функции. Это особенно полезно для итераторов, чтобы проверка выполнялась немедленно.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Range(int start, int count)
{
if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));
return Iterate();
IEnumerable<int> Iterate()
{
for (int i = 0; i < count; i++) yield return start + i;
}
}
public static void Main()
{
foreach (var n in Range(10, 3)) Console.WriteLine(n);
}
}Когда использовать локальные функции
Используйте локальную функцию, когда вспомогательная функция нужна ровно одному методу, выигрывает от описательного имени или должна обращаться к локальному состоянию метода. Это сохраняет класс чистым, а логику — легко обнаруживаемой.
using System;
public class Program
{
public static void Main()
{
int total = 0;
void Add(int n) => total += n; // helper tied to this method
Add(3); Add(4); Add(5);
Console.WriteLine(total);
}
}Быстрая проверка
Вспомните, что такое локальная функция.
Повторение
Локальные функции — это именованные вспомогательные функции, вложенные в метод.
- Они видны только в содержащем их члене.
- Поддерживают параметры, возвращаемые значения,
out/ref, обобщения и рекурсию. - На них можно ссылаться до объявления.
- Они отлично подходят для одноразовых вспомогательных функций и немедленной проверки аргументов в итераторах.
Часто задаваемые вопросы
Урок «Объявление локальных функций» бесплатный?
Да — полный текст урока «Объявление локальных функций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Объявление локальных функций»?
Определяйте вспомогательные функции внутри методов. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Объявление локальных функций»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Объявление локальных функций
- Замыкания и захваченные переменные
- Статические локальные функции
- Локальные функции и лямбда-выражения