在C#中声明事件的语法是什么?

Til*_*dor 24 c# events

在我的课程中,我想声明一个其他类可以订阅的事件.声明事件的正确方法是什么?

这不起作用:

public event CollectMapsReportingComplete;
Run Code Online (Sandbox Code Playgroud)

Jør*_*ode 34

你忘了提这个类型.对于非常简单的事件,EventHandler可能就足够了:

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

有时您会想要声明自己的委托类型以用于您的事件,允许您为EventArgs参数使用自定义类型(请参阅Adam Robinson的评论):

public delegate void CollectEventHandler(object source, MapEventArgs args);

public class MapEventArgs : EventArgs
{
    public IEnumerable<Map> Maps { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用泛型EventHandler类型而不是声明自己的类型:

public event EventHandler<MapEventArgs> CollectMapsReportingComplete;
Run Code Online (Sandbox Code Playgroud)

  • 不打算为此付出代价,但.NET中的惯例是事件委托应该只包含一个(`object`)发送者和一个继承自`EventArgs`的附加参数.这样做还允许您使用通用的`EventHandler <TEventArgs>`委托类型,而不必声明自己的委托类型.当然,你的方法没有任何问题(它可以正常工作),但流行的智慧倾向于基于EventArgs的方法. (2认同)

And*_*are 7

您需要指定事件的委托类型:

public event Action CollectMapsReportingComplete;
Run Code Online (Sandbox Code Playgroud)

我在这里使用过System.Action你可以使用你想要的任何委托类型(甚至是自定义委托).您指定的委托类型的实例将用作事件的支持字段.

  • OP没有询问.NET的事件_pattern_他们要求正确的_syntax_来声明一个事件.重要的是要理解可以使用任何委托类型声明事件. (6认同)
  • 我发现使用Action而不是EventHandler会产生更易读的代码(以及更少的代码).我几乎不需要'sender'参数.当一个事件确实需要一些参数时,我只需使用一个通用的Action,而我不需要定义一个继承自EventArgs的类(在使用EventHandler时需要). (3认同)