У меня есть следующий код:C# - анонимные функции и обработчики событий
public List<IWFResourceInstance> FindStepsByType(IWFResource res)
{
List<IWFResourceInstance> retval = new List<IWFResourceInstance>();
this.FoundStep += delegate(object sender, WalkerStepEventArgs e)
{
if (e.Step.ResourceType == res) retval.Add(e.Step);
};
this.Start();
return retval;
}
Обратите внимание, как я зарегистрировать мой член события (FoundStep) местную на месте анонимной функции.
Мой вопрос: когда функция «FindStepByType» закончится - анонимная функция будет удалена автоматически из списка делегатов события или мне придется вручную удалить ее, прежде чем выходить из функции? (и как это сделать?)
Надеюсь, мой вопрос был ясен.
Не так ли, как с использованием предикатов? Когда я использую предикаты, я не освобождаю делегата предиката. –
Предикаты не сохраняются нигде, но здесь вы подписываетесь на событие. Пока объект, содержащий событие, жив, он будет ссылаться на ваш делегат и косвенно на его переменные. Когда вы передаете, скажите: «.Where (x => x.Hidden)» к некоторому методу, метод будет работать с ним и выкидывать его (это всего лишь локальная переменная, что касается метода 'Where'. Это не относится к вашему делу. Кроме того, если 'Where' где-то его где-то хранит, вы тоже должны были бы беспокоиться об этом. –