2016-03-14 2 views
0

Скажем, у меня есть класс, который может сгореть какое-то событие, как такПравильный способ проверки делегатов событий для недействительности?

public SomeTypeOfEvent SomeEvent; 
public delegate void SomeTypeOfEvent(); 
public void FooBar() 
{ 
    if (SomeEvent != null) 
     SomeEvent(); 
} 

Является ли это правильный способ проверить, если SomeEvent делегат имеет каких-либо абонентов? Я слабо помню, как мне говорили несколько раз, что это неверно, потому что между проверкой делегата и его увольнением подписчик (а) на мероприятие может быть удален.

Каков правильный/общедоступный способ проверить, является ли делегат нулевым?

ответ

6

Это прекрасный способ, если вы не беспокоитесь о более чем одном потоке. Если да, то это не потокобезопасно, потому что в середине != проверьте, что другой поток может обнулить значение делегата, и вы получите NullReferenceException.

В C# 6.0 правильный способ: SomeEvent?.Invoke() с использованием нового оператора с нулевым условием.

MSDN рекомендует его:

Другое использование для доступа к членам нуль-условие вызова делегаты в поточно-пути с гораздо меньшим количеством кода.

PropertyChanged?.Invoke(e) 

В предыдущих версиях C# вы можете сохранить значение делегата во временную переменную, и это правильный путь.

var handler = this.PropertyChanged; 
if (handler != null) 
    handler(…) 
+0

Хм, похоже, мне нужно получить C# 6, мне очень нравится этот синтаксис намного больше, чем позже. В любом случае, спасибо! Это прояснилось для меня! – KDecker

0

Обычно я это делаю (не использовали C# 6.0 много еще).

public event EventHandler SomeEvent; 

private void OnSomeEvent() { 
    var someEvent = SomeEvent; 
    if (someEvent != null) { 
     someEvent(this, EventArgs.Empty); 
    } 
} 
Смежные вопросы