我有这样的代码:
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 中。
请帮忙。提前致谢。
最佳答案
好吧,它会有效地清除订阅者列表,是的(通过将底层委托(delegate)字段设置为 null
)- 这样下次设置 ProcessProgress
时,不会调用任何处理程序。它并没有真正将 event 设置为 null
- 它正在将基础字段设置为 null
。只是 C# 编译器使用单个声明创建一个事件(一对订阅/取消订阅方法)和一个字段(用于存储处理程序)。
你可以找到我的 article about events and delegates有用。
请注意,您的事件引发代码目前不是线程安全的。我不知道是否需要这样做,但您可能希望考虑使用:
set
{
_processProgress = value;
var handlers = ProcessProgressChanged;
if (handlers != null)
{
handlers(value);
}
}
如果最后一个处理程序在无效性检查之后但调用之前取消订阅,那么您将不会得到NullReferenceException
。 p>
关于c# - 将事件设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513292/