C# C#  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Сложный  ·  👥 1 прошёл

Делегаты и события

Разбирает делегаты, Action, Func и события на поведении списка вызовов, подписках и времени жизни объектов. Вопросы затрагивают повторную подписку, отписку лямбд, async-обработчики и способы не превратить уведомления в источник утечек и скрытых ошибок.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 25
В каком порядке многоадресный делегат вызовет First и Second?
C#
static void First() => Console.Write("A");
static void Second() => Console.Write("B");
Action work = First;
work += Second;
work();
Вопрос 2 из 25
Какое значение вернёт вызов многоадресного Func<int>?
C#
Func<int> f = () => 1;
f += () => 2;
Console.WriteLine(f());
Вопрос 3 из 25
Что случится с третьим обработчиком?
C#
Action a = () => Console.Write("1");
a += () => throw new InvalidOperationException();
a += () => Console.Write("3");
a();
Вопрос 4 из 25
Как безопасно вызвать делегат, который может быть null?
Вопрос 5 из 25
Почему присваивание группы методов полезнее немедленного вызова?
Вопрос 6 из 25
Какой тип соответствует функции, принимающей string и int и возвращающей bool?
Вопрос 7 из 25
Какое число вернёт compose(4), если сначала удвоить аргумент, затем прибавить семь?
C#
Func<int, int> doubleIt = x => x * 2;
Func<int, int> addSeven = x => x + 7;
Func<int, int> compose = x => addSeven(doubleIt(x));
Console.WriteLine(compose(4));
Вопрос 8 из 25
Какой риск возникает здесь?
C#
Action save = async () =>
{
    await Task.Delay(10);
    throw new Exception("write failed");
};
save();
Вопрос 9 из 25
Какой делегат естественнее передать в List<T>.Find?
Вопрос 10 из 25
Как сохранить возможность ожидать асинхронный обработчик?
C#
Func<Task> refresh = async () =>
{
    await LoadAsync();
    Render();
};
await refresh();
Вопрос 11 из 25
Почему внешний код не может вызвать publisher.Changed()?
Вопрос 12 из 25
Что будет напечатано?
C#
var count = 0;
EventHandler h = (_, _) => count++;
source.Changed += h;
source.Changed += h;
source.RaiseChanged();
Console.WriteLine(count);
Вопрос 13 из 25
Что обычно передают как sender в EventHandler?
Вопрос 14 из 25
Как передать неизменяемые данные о событии?
C#
public sealed record OrderPaidEventArgs(Guid OrderId, decimal Amount);
public event EventHandler<OrderPaidEventArgs>? OrderPaid;

private void RaisePaid(Guid id, decimal amount) =>
    OrderPaid?.Invoke(this, new(id, amount));
Вопрос 15 из 25
Зачем иногда реализуют custom add/remove у события?
C#
public event EventHandler Changed
{
    add    => inner.Changed += value;
    remove => inner.Changed -= value;
}
Вопрос 16 из 25
Почему эта отписка не удалит обработчик?
C#
button.Click += (_, _) => Save();
button.Click -= (_, _) => Save();
Вопрос 17 из 25
Как исправить предыдущий случай?
C#
EventHandler handler = (_, _) => Save();
button.Click += handler;
// ...
button.Click -= handler;
Вопрос 18 из 25
Когда подписка может удерживать объект в памяти?
Вопрос 19 из 25
Как реализовать обработчик только для первого события?
C#
EventHandler? once = null;
once = (s, e) =>
{
    source.Changed -= once;
    HandleFirstChange();
};
source.Changed += once;
Вопрос 20 из 25
Какой контракт удобен для библиотечной подписки?
Вопрос 21 из 25
Какой тест лучше всего проверяет событие OrderPaid?
Вопрос 22 из 25
Что покажет тест?
C#
var count = 0;
source.Changed += (_, _) => count++;
source.RaiseChanged();
Assert.Equal(1, count);
Вопрос 23 из 25
Как диагностировать медленный обработчик без изменения контракта события?
C#
foreach (var d in changed.GetInvocationList())
{
    var started = Stopwatch.GetTimestamp();
    try { ((EventHandler)d)(this, EventArgs.Empty); }
    finally { metrics.RecordHandler(d.Method.Name, Stopwatch.GetElapsedTime(started)); }
}
Вопрос 24 из 25
Что должен решить издатель, если один подписчик бросает исключение?
Вопрос 25 из 25
Какая метрика полезна для асинхронной шины событий?
C#
metrics.QueueDepth.Set(channel.Reader.Count);
metrics.DeliveryLatency.Record(DateTimeOffset.UtcNow - message.CreatedAt);
metrics.Failures.Add(1, new("event", message.Type));

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу