OOP Course
Сьогодні

Підрозділ 6.2

Лямбди

Розглядає лямбда-вирази як компактний запис анонімних методів: параметри, повернення результату, додавання і видалення дій та передавання лямбд у методи.

6.2. Лямбди

Лямбда-вираз — це компактний синтаксис для визначення анонімних методів. Там, де раніше потрібно було писати ключове слово delegate, список параметрів у дужках і тіло у фігурних дужках, лямбда дозволяє записати все в один рядок. З погляду типів даних лямбда-вираз представляє делегат — тобто посилання на метод із певною сигнатурою. Лямбди особливо корисні, коли метод короткий, застосовується в одному місці і немає сенсу виносити його у самостійну функцію.

Лямбда-оператор => розбиває вираз на дві частини: ліворуч — список параметрів, праворуч — тіло:

(список_параметрів) => тіло

Якщо тіло є одним виразом — фігурні дужки не потрібні. Якщо тіло містить кілька інструкцій — воно оформляється як звичайний блок у фігурних дужках.

Базовий синтаксис

Розглянемо найпростішу лямбду без параметрів, яка виводить повідомлення:

Змінна greet представляє делегат PatientHandler — метод без параметрів і без повернення. Як значення надається лямбда-вираз: ліворуч від => порожні дужки (немає параметрів), праворуч — єдиний вираз.

Якщо лямбда виконує кілька дій — вони поміщаються у фігурні дужки:

Синтаксис лямбда-виразу

Починаючи з C# 10 можна застосовувати неявну типізацію через var. Компілятор сам виводить тип делегата з контексту:

При неявній типізації компілятор зіставляє лямбда-вираз із вбудованим делегатом. У цьому прикладі greet буде типу Action — стандартного делегата без параметрів і без повернення.

Параметри лямбди

При визначенні списку параметрів типи даних зазвичай можна не вказувати — компілятор виводить їх з типу делегата:

Компілятор бачить, що alert є типом AlertHandler, де обидва параметри — string, тому name і msg автоматично отримують тип string.

Якщо ж застосовується неявна типізація через var, компілятор не може вивести типи параметрів — тоді їх потрібно вказати явно:

Якщо лямбда має рівно один параметр і його тип можна вивести — дужки навколо параметра можна опустити:

Повернення результату

Лямбда-вираз може повертати результат. Якщо тіло є єдиним виразом — значення повертається автоматично, без return:

Якщо лямбда містить кілька виразів — потрібен явний return, як у звичайному методі:

Додавання та видалення дій у лямбда-виразі

Оскільки лямбда-вираз представляє делегат, до змінної-лямбди можна додавати інші методи та лямбди через +=, а також видаляти через -=:

При виклику alert() послідовно виконуються всі методи зі списку виклику. Після видалення sendSMS залишаються лише два перших.

Лямбда-вираз як аргумент методу

Найпрактичніше застосування лямбд — передача їх як аргументи методам. Це дозволяє параметризувати поведінку: метод визначає загальну структуру, а конкретна дія передається ззовні:

Метод CountMatching не знає, яка конкретно умова застосовується — він лише викликає делегат condition для кожного елемента. Умова передається зовні через лямбду: x => x > 6.1 або x => x < 3.9. Такий підхід дозволяє повторно використовувати метод для будь-яких критеріїв фільтрації без зміни самого методу.

Лямбда-вираз як результат методу

Метод може повертати лямбда-вираз. Тип, що повертається, — делегат, якому відповідає лямбда:

Метод SelectAnalysis отримує тип аналізу і повертає відповідну лямбду з потрібними порогами норми. Зовнішній код отримує готову функцію-класифікатор і може викликати її для будь-якого значення. Такий патерн часто називають «фабрикою функцій» — метод конструює і повертає поведінку, а не лише дані.

Лямбда vs анонімний метод vs іменований метод

Розроблено Tomka Yurii · © 2026 ·