奇怪的是,我无法在文档或网络上找到答案,尽管这似乎是一个简单的问题:
想象一下,我在条件块中注册了一个c#事件:
void Execute()
{
if(loader.AlreadyCompleted)
{
DoSomething();
}
else
{
loader.Completed += DoSomething;
}
}
在此示例中,加载程序将触发Completed
事件。如果它已经被替换AlreadyCompleted
将为真,否则它是假的,我想注册Completed
事件,以便在执行DoSomething
之前等待。
现在假设我有一个可以随时触发的中止功能。
在Abort函数中,我需要从Completed
事件中取消注册。
void Abort()
{
loader.Completed -= DoSomething;
}
如果加载程序在启动时准备就绪并且我们从未执行过行loader.Completed += DoSomething;
会发生什么? 我们可以取消注册尚未注册的活动吗?有没有办法检查我们是否已注册?在这种情况下,最佳做法是什么?
答案 0 :(得分:2)
如果您尝试取消注册从未注册的事件,则不会发生任何事情。这是因为当你致电loader.Completed -= DoSomething;
时,它真的只是在说loaded.Completed = (Completed)Delegate.Remove(DoSomething)
。
当您尝试删除从未添加或不存在的事件处理程序时,Delegate.Remove将返回null,这将设置loaded.Complete = null
。