Является ли регистрация / отмена регистрации события .NET постоянной операцией? - PullRequest
1 голос
/ 23 августа 2011

Первоначально я предполагал, что да, потому что я понял, что список вызовов для многоадресного делегата реализован как связанный список, который поддерживает постоянное время вставки и удаления. Однако, поскольку многоадресные делегаты являются неизменяемыми, кажется, что любая операция добавления / удаления на самом деле требует копирования списка вызовов. Это правильно, или я что-то упустил?

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

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

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

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

Раскрутите тестовый проект и попробуйте - фактическое измерение превосходит любое количество мудрых стариков (или женщин).

Обновление

Одна мысль: если ваш конкретный случай относится к расположению объектов, попробуйте что-то вроде этого:

public event PropertyChanged
{
    add { mPropertyChanged += value; }
    remove { mPropertyChanged -= value; }
}

public void Dispose()
{
    mPropertyChanged = null;
}

В вашем методе Dispose вы можете отказаться от всех подписок одним попаданием, просто удалив ссылку на сохраненное событие. Это, несомненно, будет быстрее, чем отписаться по одному.

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

1 голос
/ 28 сентября 2016

В соответствии с комментарием Пассанта 22 августа '11 в 21: 31

Добавление амортизируется O (1), точно такая же логика, как List <>. Add (). Удаление - это O (n). Вы не можете изменить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...