将事件设置为空

时间:2012-03-01 09:01:45

标签: c# winforms events .net-4.0

我有这样的代码:

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中。

请帮忙。提前谢谢。

2 个答案:

答案 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