Как уведомить подписчика события

#c# #events

#c# #Мероприятия

Вопрос:

На моем последнем собеседовании при приеме на работу меня спросили, как реализовать класс, который предоставляет событие и уведомляет новых подписчиков события в тот момент, когда они подписываются на это событие.

Другими словами, класс предоставляет событие для информирования подписчиков об обновлении источника данных; многие другие классы могут подписаться на событие в любой момент времени. Когда класс подписывается на событие, он должен быть уведомлен, чтобы получить последнюю версию данных, сохраненных в источнике данных, но другие классы не должны получать уведомления (они уже обновлены).

Они предложили мне переопределить метод AddHandler, но как мне уведомить только нового подписчика?

Есть ли функция .net, о которой я не знаю, или мне нужно определить метод в классе subscriber, который будет вызываться при добавлении в обработчик (какой-то шаблон наблюдателя)?

РЕДАКТИРОВАТЬ: я думаю, что я не совсем ясно выразился, поэтому я попытаюсь объяснить это по-другому. Предположим, у меня есть шаблон наблюдателя. Когда новый наблюдатель подписывается на subject, он немедленно обновляется с последними значениями источника данных по subject.Позже, когда что-то внутри источника данных изменится, субъект уведомит всех зарегистрированных наблюдателей, как обычно. Меня спросили, как это сделать с помощью событий .net

Ответ №1:

Ваша терминология запутанна — что вы подразумеваете под «оно должно быть активировано»? Вы имеете в виду, что обработчик события должен быть вызван один раз в момент подписки? Если это так, это звучит примерно так:

 private EventHandler foo;

public event EventHandler Foo 
{
    add
    {
        if (value != null)
        {
            value(this, EventArgs.Empty);
        }
        foo  = value;
    }

    remove
    {
        foo -= value;
    }
}
  

Хотя это довольно странный дизайн.

Если это не то, что вам нужно, пожалуйста, попробуйте уточнить.

Смотрите мою статью о событиях и делегатах для получения дополнительной информации.

Комментарии:

1. Не возникает ли ситуации, когда подписчик добавляет к событию, которое им немедленно нужно предоставить с последним значением. В этом случае этот шаблон не может быть полезен.

2. В моем понимании, они хотели знать, как уведомить только последнего подписчика события, я предложил вызывать событие при любой новой подписке, они ответили, что таким образом я бы уведомил всех подписчиков (и простите мой плохой английский, я заменил «активирован» на «уведомлен»)

3. @Stefano: на самом деле нет. Это вызовет его только для нового делегата, который хранится в value. Я бы также задался вопросом, хороший ли это дизайн. На самом деле я не ожидаю, что событие будет вызвано до того, как завершится подписание. Было бы лучше позволить клиенту извлекать новую информацию, когда это необходимо, прежде чем он начнет прослушивать события.