如何安全地开火活动

Bra*_*rad 2 c# events .net-2.0

如果事件没有订阅者,我如何确保在触发事件时不会抛出异常.

 // Delegate declaration
 public delegate void _delDisplayChange(object sender,string option);

 // Event declaration
 public event _delDisplayChange  DisplayChange;

 //throwing the event
 DisplayChange(this, "DISTRIBUTION");
Run Code Online (Sandbox Code Playgroud)

Bri*_*sio 18

以下是推荐的方法:

protected void RaiseDisplayChanged(string message)
{
    var handlers = DisplayChange;
    if(handlers != null)
        handlers(this, message);
}
Run Code Online (Sandbox Code Playgroud)

在检查之前复制事件处理程序枚举会做两件事:

  1. 如果DisplayChange处理程序在检查和触发之间变为null,则不会死亡
  2. 如果侦听器在枚举时修改DisplayChange列表,则不会遇到奇怪的情况.

此外,您没有使用标准的事件协议.你的代表应该是:

public delegate void DisplayChangeDelegate(object sender, OptionsEventArgs args);
Run Code Online (Sandbox Code Playgroud)

OptionsEventArgs派生自EventArgs的位置.更进一步,在.Net 3.5中,你永远不应该像这样定义一个委托.相反,您应该只定义您的事件:

public event EventHandler<OptionsEventArgs> DisplayChanged;
Run Code Online (Sandbox Code Playgroud)

我想通过定义这个类更进一步:

public class EventArgs<T> : EventArgs
{
    public T Payload { get; private set }
    public EventArgs(T payload)
    {
        Payload = payload;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您不需要定义OptionsEventArgs:

public event EventHandler<EventArgs<string>> DisplayChanged;
Run Code Online (Sandbox Code Playgroud)

只是想一些东西......