没有参数的C#事件.我该如何处理它们?

Rya*_*anG 21 c# events

我目前正在开发一个游戏菜单系统,我有屏幕和屏幕元素的标准层次结构.(屏幕包含一些屏幕元素集合).我希望屏幕元素将事件发送到屏幕类以声明它已被选中.但是,在这种情况下我不需要任何事件参数.我不确定在没有任何参数的情况下创建事件的语法是什么.我找到了一个将播放器索引作为事件参数传递的解决方案.(我的游戏严格来说是单人游戏,所以这不是必需的.)

public event EventHandler<PlayerIndexEventArgs> Selected;
Run Code Online (Sandbox Code Playgroud)

^ - 如何在EventIndexEventArgs从EventArgs继承的地方声明此事件.我可以省略PlayerIndexEventArgs,还是有默认类型在这里使用不发送参数?(也许只是EventArgs基类?)

Dmi*_*nov 52

您可以使用Action委托.这比使用您永远不需要的数据(我的意思是EventArgs)要优雅得多.

在这里定义事件:

public event Action EventWithoutParams;
public event Action<int> EventWithIntParam;
Run Code Online (Sandbox Code Playgroud)

在这里你发射事件:

EventWithoutParams();
EventWithIntParam(123);
Run Code Online (Sandbox Code Playgroud)

您可以在ActionAction <T>中找到所需的所有信息.

可以使用no-op委托初始化这些事件中的任何一个,... = delegate { };以便在触发事件之前不需要检查null.

  • 不幸的是,不,简单地调用`EventWithoutParams()`并不是解雇事件的最佳方式.正如Eric Lippert指出的那样,原因是你最终可能会遇到NullReferenceException.你需要做的是复制委托引用:`Action eventWithoutParamsTemp = EventWithoutParams;`然后执行空检查:`if(eventWithoutParamsTemp!= null)eventWithoutParamsTemp();`参考:http://blogs.msdn.com/ ericlippert /存档/ 2009/04 /第29 /事件和-races.aspx (4认同)

Qui*_*son 11

尝试:

public event EventHandler Selected;
Run Code Online (Sandbox Code Playgroud)

然后打电话..

Selected(null, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)

这样它就是默认的事件定义,如果你不想要,你不需要传递任何信息.


Rya*_*yan 0

(也许只是 EventArgs 基类?)

你应该这样做。

来自EventArgs上的 MSDN 文档:

该类不包含事件数据;它由在引发事件时不将状态信息传递给事件处理程序的事件使用。