c# - 处理类中创建事件的最简单方法

标签 c# events

在 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/

相关文章:

c# - 单元测试 - 如何测试长时间运行的外部进程

c# - 可以在 C# 中实例化具有私有(private)和公共(public)构造函数的类 - 奇怪

python - 键盘中断事件监听

java - 调整已完成事件的大小?

javascript - 我想在 fullcalendar 3.0.1 中动态显示事件

apache-flex - 柔性,柔性单元 : How to test that an event is dispatched twice?

用于 C 程序的 C# GUI

c# - 使用网络凭据在运行时更新 HttpMessageHandler 或创建类型化 HttpClient

c# 对象 obj 的值为 {}。什么是 "{}"?

c# - WPF - 知道哪个控件最终会获得焦点