Выбор ответа Senior Делегаты и события обновлено
Аллокации лямбд и static-лямбды
Вопрос
Когда лямбда не создаёт новый объект при каждом вызове метода, где она объявлена?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Когда она ничего не захватывает: делегат кешируется. Лямбда без захвата компилируется в метод и делегат, который создаётся один раз и кешируется, поэтому повторные вызовы не аллоцируют.
Варианты ответа
- Всегда: лямбды компилируются в статические методы класса
- Только если она объявлена с модификатором
async - Никогда: каждая лямбда это новый объект делегата
- Когда она ничего не захватывает: делегат кешируетсяправильный ответ
Разбор
Лямбда без захвата компилируется в метод и делегат, который создаётся один раз и кешируется, поэтому повторные вызовы не аллоцируют. Захват переменной или this требует объекта-замыкания и нового делегата на каждый проход. Модификатор static (C# 9) запрещает захват и гарантирует, что случайно его не добавят. async к аллокациям делегата отношения не имеет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
События, колбэки и их альтернативы
Следующий вопрос
Как избежать утечки через подписки