我有这样的代码:
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;
}
}
当我调用ProcessProgressChanged
方法时,它会<{>>取消订阅 ClearProcessProgressChangedEvent()
事件中的所有方法吗?
我的代码在C#,框架4中,在VS2010 Pro中构建,项目在Winforms中。
请帮忙。提前谢谢。
答案 0 :(得分:17)
好吧,它会有效地清除订阅者列表,是(通过将基础委托字段设置为null
) - 以便下次设置ProcessProgress
时,不会有任何处理程序调用。它并未真正将事件设置为null
- 它将基础字段设置为null
。只是C#编译器使用单个声明创建了一个事件(一个订阅/取消订阅方法对)和一个字段(用于存储处理程序)。
您可能会发现我的article about events and delegates很有用。
请注意,您的事件提升代码目前不是线程安全的。我不知道是否需要,但您可能希望考虑使用:
set
{
_processProgress = value;
var handlers = ProcessProgressChanged;
if (handlers != null)
{
handlers(value);
}
}
如果最后一个处理程序在无效检查后取消订阅,在调用之前
,那么您将无法获得NullReferenceException
。
答案 1 :(得分:5)
是的,它会取消订阅活动中的所有人。有一个(位间接恕我直言)引用此here:
当所有订阅者都取消订阅活动时,该活动 发布商类中的实例设置为
null
。