На MSDN я нашел следующее:
public event EventHandler<MyEventArgs> SampleEvent;
public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
EventHandler<MyEventArgs> temp = SampleEvent;
Действительно ли это - ссылка?
Раз так я не понимаю его значение как тогда, когда SampleEvent стал пустым, временный файл - также
if (temp != null)
temp(this, new MyEventArgs(val));
}
Это паранойя, связанная с потоками. Если другой поток отменит подписку на последний обработчик сразу после того, как вы проверили его на null
, он может стать null
, и вы вызовет исключение. Поскольку делегаты неизменяемы, запись снимка делегата в переменную предотвращает это.
Конечно, у него есть другой побочный эффект, что вы можете (вместо этого) в конечном итоге инициировать событие для объекта, который считает, что он уже отписался ...
Но подчеркнем - это только проблема, когда несколько потоков подписываются / отменяют подписку на объект, что a: редко и b: не совсем желательно.