c#event,unregister without prior register

时间:2017-09-01 10:46:24

标签: c# events

奇怪的是,我无法在文档或网络上找到答案,尽管这似乎是一个简单的问题:

想象一下,我在条件块中注册了一个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;会发生什么? 我们可以取消注册尚未注册的活动吗?有没有办法检查我们是否已注册?在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

如果您尝试取消注册从未注册的事件,则不会发生任何事情。这是因为当你致电loader.Completed -= DoSomething;时,它真的只是在说loaded.Completed = (Completed)Delegate.Remove(DoSomething)。 当您尝试删除从未添加或不存在的事件处理程序时,Delegate.Remove将返回null,这将设置loaded.Complete = null