Если я напишу что-то вроде
myDataModel.ContentLoaded += (o,e) => { DoSomething(); }
Когда (если когда-либо) этот анонимный делегат будет удален из события?
В качестве быстрого примера я мог бы написать эту программу
class Program
{
public event EventHandler<EventArgs> MyEvent = delegate { };
static void Main(string[] args)
{
Program p = new Program();
while(true)
{
p.MyEvent += (o, e) => Console.WriteLine("Hello!");
Console.ReadLine();
p.Foo();
}
}
void Foo()
{
MyEvent(this, EventArgs.Empty);
}
}
И вывод, когда я нажимаю «Ввод» несколько раз, равен
Hello!
Hello!
Hello!
Hello!
Hello!
Hello!
Hello!
Hello!
Hello!
Hello!
... и так далее. Я мог бы добавить строку
p.MyEvent -= (o, e) => Console.WriteLine("Hello!");
после p.Foo()
но, конечно, это не имеет никакого эффекта, потому что я удаляю совершенно другого анонимного делегата.
Так в чем же дело? Можно ли вообще удалить этих анонимных делегатов? Каковы последствия, скажем, для асинхронного приложения Silverlight, где я извлекаю данные с помощью выражений типа
_myDataContext.Load(myQuery, loadOperation =>
{
// do stuff with the data here
}, null);
? Я предполагаю, что такого рода обратные вызовы не реализованы с использованием событий, но, конечно, невозможно (?) Сказать.
Опасны ли анонимные делегаты, если их тщательно не учитывать?