在 VS 2015 中玩时,我正在创建一个属性,但在点击选项卡之前输入错误,它给了我一个看起来非常干净简单的创建事件的方法。我不确定如何使用它来接受附加参数来传递数据(因为我通常希望在引发事件时传递数据,其中包含有关正在进行的操作或已完成的操作的信息)
它给出的代码如下:
public event EventHandler<EventArgs> MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
EventHandler<EventArgs> handler = MyEvent;
if (handler != null)
handler(this, e);
}
乍一看,它与大多数示例类似,但此方法似乎不需要委托(delegate)来操作。与 How to call an event manually in C#? 中的以下示例进行比较
public delegate void MyEventHandler(object sender, MyEventArgs e)
public event MyEventHandler MyEvent;
public void RaisesMyEvent()
{
if(MyEvent != null) //required in C# to ensure a handler is attached
MyEvent(this, new MyEventArgs(/*any info you want handlers to have*/));
}
我想知道,鉴于拥有更优雅(干净)的代码,微软提供的方法(这个问题中的第一个方法)更好(看起来更干净),如果是这样,我该如何调整它稍微接受除标准事件参数之外的字符串和/或扩展事件参数以传递信息?
最佳答案
要在 EventHandler
上传递自定义参数,您需要创建自己的从 EventArgs
派生的类,并更改声明,如下所示:
public event EventHandler<MyCustomEventArgs> MyEvent;
或者,如果您不喜欢在处理程序中使用对象发送者
,您可以执行以下操作:
public event Action<MyCustomEventArgs> MyEvent;
甚至
public event Action<string> MyEvent;
就调用而言,微软的更好。原因是您编写的空检查不是线程安全的。在执行 null 检查之前存储处理程序可确保您不会调用 null 方法。
或者,使用 C# 6 调用并利用 null 条件运算符:
MyEvent?.Invoke(whateverArgs);
关于c# - 处理类中创建事件的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38276965/