关键字 event (C# 参考)

借助事件成员,对象可以触发通知。 事件用户可以通过提供事件处理程序来附加事件的可执行代码。 event 关键字声明事件。 该事件属于委托类型。 当对象触发事件时,该事件将调用所有提供的事件处理程序。 事件处理程序是添加到事件的委托实例,并在引发事件时执行。 事件用户可以在事件上添加或删除其事件处理程序。

下面的示例演示如何声明和引发使用 EventHandler 作为基础委托类型的事件。 有关完整的代码示例,请参阅 如何发布符合 .NET 准则的事件。 此示例演示泛型 EventHandler<TEventArgs> 委托类型、如何订阅事件和创建事件处理程序方法,

public class SampleEventArgs
{
    public SampleEventArgs(string text) { Text = text; }
    public string Text { get; } // readonly
}

public class Publisher
{
    // Declare the delegate (if using non-generic pattern).
    public delegate void SampleEventHandler(object sender, SampleEventArgs e);

    // Declare the event.
    public event SampleEventHandler SampleEvent;

    // Wrap the event in a protected virtual method
    // to enable derived classes to raise the event.
    protected virtual void RaiseSampleEvent()
    {
        // Raise the event in a thread-safe manner using the ?. operator.
        SampleEvent?.Invoke(this, new SampleEventArgs("Hello"));
    }
}

事件是多播委托,只能从类(或派生类)或声明它们的结构(发布者类)内部调用。 如果其他类或结构订阅事件,则发布者类引发事件时会调用其事件处理程序方法。 有关详细信息和代码示例,请参阅事件委托

事件可以标记为public、、privateprotectedinternalprotected internalprivate protected。 这些访问修饰符定义该类的用户访问该事件的方式。 有关详细信息,请参阅访问修饰符

从 C# 14 开始,事件可以是 partial。 部分事件有一个定义声明和一个实现声明。 定义声明必须使用类似于字段的语法。 实现声明必须声明 addremove 处理程序。

关键字和事件

下列关键字应用于事件。

关键字 说明 更多信息
static 使事件可供调用方在任何时候进行调用,即使不存在类的实例。 静态类和静态类成员
virtual 允许派生类使用重写关键字重写事件行为。 继承
sealed 指定对于派生类,它不再是虚拟类。
abstract 编译器不会生成 addremove 事件访问器块,因此派生类必须提供自己的实现。

事件可以使用静态关键字声明为 静态 事件。 静态事件随时可供调用方使用,即使类的实例不存在也是如此。 有关详细信息,请参阅静态类和静态类成员

可以使用关键字将事件标记为虚拟事件 virtual 。 派生类可以使用关键字替代事件行为 override 。 有关详细信息,请参阅继承。 也可以是 sealed替代虚拟事件的事件,它指定对于派生类而言,它不再是虚拟的。 最后,可以声明 abstract事件,这意味着编译器不会生成 add 事件访问器块和 remove 事件访问器块。 因此,派生类必须提供其自己的实现。

C# 语言规范

有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

另请参阅