将事件设置为空
我有这样的代码:
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
。