【问题标题】:C# Events without arguments. How do I handle them?没有参数的 C# 事件。我该如何处理它们?
【发布时间】:2016-02-19 20:39:31
【问题描述】:

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

public event EventHandler<PlayerIndexEventArgs> Selected;

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

【问题讨论】:

    标签: c# events


    【解决方案1】:

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

    在这里定义事件:

    public event Action EventWithoutParams;
    public event Action<int> EventWithIntParam;
    

    在这里你触发事件:

    EventWithoutParams();
    EventWithIntParam(123);
    

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

    这些事件中的任何一个都可以使用无操作委托 ... = delegate { }; 进行初始化,这样您就无需在触发事件之前检查 null。

    【讨论】:

    • 聪明的想法,不知道为什么人们愿意做所有不必要的活动工作只是为了浪费他们的优势!
    • 很遗憾,不,简单地调用EventWithoutParams() 并不是触发事件的最佳方式。正如 Eric Lippert 指出的那样,原因是您最终可能会遇到 NullReferenceException。您需要做的是复制委托参考:Action eventWithoutParamsTemp = EventWithoutParams;,然后执行空检查:if (eventWithoutParamsTemp != null) eventWithoutParamsTemp(); 参考:blogs.msdn.com/ericlippert/archive/2009/04/29/…
    • 谢谢,杰森,您的评论。我省略了这一点,以便专注于使用 Action 委托本身,而不是正确使用事件。我认为每个人都已经知道如何使用事件 :) 如果不知道 - 他们应该阅读 Jefry Richter 的书。
    • 或者现在您可以使用EventWithoutParams?.Invoke() 来避免任何NullReferenceException
    • 甜蜜但仅限于 c#6.0 及以上
    【解决方案2】:

    试试:

    public event EventHandler Selected;
    

    然后打电话..

    Selected(null, EventArgs.Empty);
    

    这样它是默认的事件定义,如果您不想传递任何信息,则无需传递任何信息。

    【讨论】:

    • 这家伙真的应该使用 Action 变量,因为它们不那么麻烦并且在大多数情况下都可以正常工作。
    【解决方案3】:

    你可以写:

    public event EventHandler Selected;
    

    【讨论】:

      【解决方案4】:

      (也许只是 EventArgs 基类?)

      你应该这样做。

      来自EventArgs 上的 MSDN 文档:

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

      【讨论】:

        【解决方案5】:

        按照您提到的PlayerIndexEventArgs 类型,我假设您使用的是XNA,对吗?如果是这样,请查看Game State Management 示例。如果不是,代码可能会帮助您了解如何去做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-04
          • 1970-01-01
          • 1970-01-01
          • 2012-07-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          相关资源
          最近更新 更多