Список вызовов может быть довольно длинным, поэтому я действительно хочу, чтобы это была операция с постоянным временем.
Как долго это "довольно" долго? Если вы не говорите о тысячах подписчиков, вряд ли это будет значительный период времени.
Раскрутите тестовый проект и попробуйте - фактическое измерение превосходит любое количество мудрых стариков (или женщин).
Обновление
Одна мысль: если ваш конкретный случай относится к расположению объектов, попробуйте что-то вроде этого:
public event PropertyChanged
{
add { mPropertyChanged += value; }
remove { mPropertyChanged -= value; }
}
public void Dispose()
{
mPropertyChanged = null;
}
В вашем методе Dispose
вы можете отказаться от всех подписок одним попаданием, просто удалив ссылку на сохраненное событие. Это, несомненно, будет быстрее, чем отписаться по одному.
Да, вы оставляете многоадресный делегат сборщику мусора, но вы делаете это в любом случае, когда отписываетесь - фактически один раз за отписку.