Выбор ответа Senior Делегаты и события обновлено

Аллокации лямбд и static-лямбды

Вопрос

Когда лямбда не создаёт новый объект при каждом вызове метода, где она объявлена?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Когда она ничего не захватывает: делегат кешируется. Лямбда без захвата компилируется в метод и делегат, который создаётся один раз и кешируется, поэтому повторные вызовы не аллоцируют.

Варианты ответа

  1. Всегда: лямбды компилируются в статические методы класса
  2. Только если она объявлена с модификатором async
  3. Никогда: каждая лямбда это новый объект делегата
  4. Когда она ничего не захватывает: делегат кешируетсяправильный ответ

Разбор

Лямбда без захвата компилируется в метод и делегат, который создаётся один раз и кешируется, поэтому повторные вызовы не аллоцируют. Захват переменной или this требует объекта-замыкания и нового делегата на каждый проход. Модификатор static (C# 9) запрещает захват и гарантирует, что случайно его не добавят. async к аллокациям делегата отношения не имеет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме