关于事件的价值/参考类型的问题

Pet*_*etr 11 c# events event-handling

在MSDN上,我发现以下内容:

public event EventHandler<MyEventArgs> SampleEvent;

public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
    EventHandler<MyEventArgs> temp = SampleEvent; 
Run Code Online (Sandbox Code Playgroud)

它是参考吗?
如果是这样,我不理解其含义,因为当SampleEvent变为null时,temp也是如此

    if (temp != null)
        temp(this, new MyEventArgs(val));
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 12

这是与线程有关的偏执狂.如果另一个线程您检查完它之后取消订阅最后一个处理程序null,它可能会变成 null并且您将导致异常.由于委托是不可变的,因此将委托的快照捕获到变量中会阻止这种情况发生.

当然,它确实有另一个副作用,你可以(而不是)最终提升事件对一个认为已经取消订阅的对象......

但要强调 - 当多个线程订阅/取消订阅对象时,这只是一个问题,这是:罕见,而b:不完全合乎需要.

  • 请注意,您可以*总是*最终针对认为已取消订阅的处理程序引发事件 - 因为它可能在您开始执行委托之后但在您到达取消订阅之前取消订阅. (3认同)