Установка события в ноль - PullRequest
11 голосов
/ 01 марта 2012

У меня есть такой код:

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 #, framework 4, сборка в VS2010 Pro, проект в Winforms.

Пожалуйста, помогите.Заранее спасибо.

Ответы [ 2 ]

17 голосов
/ 01 марта 2012

Что ж, он эффективно очистит список подписчиков, да (установив базовое поле делегата на null) - так что в следующий раз, когда будет установлен ProcessProgress, обработчики не будут вызываться. Это на самом деле не установка события на null - это установка базового поля на null. Просто компилятор C # создает как событие (пара методов подписки / отписки), так и поле (для хранения обработчиков) с помощью одного объявления.

Вы можете найти мою статью о событиях и делегатах полезной.

Обратите внимание, что ваш код повышения событий в настоящее время не является поточно-ориентированным. Я не знаю, должно ли это быть или нет, но вы можете рассмотреть , используя:

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

Таким образом, вы не получите NullReferenceException, если последний обработчик отписан после проверки недействительности, но до вызова.

5 голосов
/ 01 марта 2012

Да, он откажется от всех на мероприятии.Существует (битовая косвенная IMHO) ссылка на это здесь :

Когда все подписчики отписались от события, для экземпляра события в классе издателя устанавливается значение null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...