将事件设置为空

我有这样的代码:

public class SomeClass { int _processProgress; public int ProcessProgress { get { return _processProgress; } set { _processProgress = value; if (ProcessProgressChanged != null) ProcessProgressChanged(value); } } public delegate void ProcessProgressChangedEventHandler(int progressPercentage); public event ProcessProgressChangedEventHandler ProcessProgressChanged; public void ClearProcessProgressChangedEvent() { this.ProcessProgressChanged = null; } } 

当我调用ClearProcessProgressChangedEvent()方法时,它会取消订阅 ProcessProgressChanged事件中的所有方法吗?

我的代码在C#,框架4,在VS2010 Pro中构建,项目在Winforms中。

请帮忙。 提前致谢。

好吧,它将有效地清除订阅者列表,是(通过将底层委托字段设置为null ) – 以便下次设置ProcessProgress ,不会调用任何处理程序。 它并没有真正将事件设置为null – 它将基础字段设置为null 。 只是C#编译器使用单个声明创建事件(订阅/取消订阅方法对)和字段(存储处理程序)。

您可能会发现我关于事件和委托的文章很有用。

请注意,您的事件提升代码目前不是线程安全的。 我不知道是否需要,但你可能想考虑使用:

 set { _processProgress = value; var handlers = ProcessProgressChanged; if (handlers != null) { handlers(value); } } 

这样,如果在无效检查之后但调用之前取消订阅最后一个处理程序,则不会获得NullReferenceException

是的,它将取消订阅活动中的所有人。 这里有一个(位间接恕我直言)参考:

当所有订阅者都从事件中取消订阅时,发布者类中的事件实例将设置为null