如果我写类似
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);
}
}
我反复按“Enter”时的输出是
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);
? 我假设这些类型的回调不是使用事件实现的,但当然不可能(?)说出来。
如果不仔细考虑匿名代表是否危险?