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

下面的示例显示如何声明和引发使用 EventHandler 作为底层委托类型的事件。

public class SampleEventArgs
{
    public SampleEventArgs ( string 文本 ) { 文本 = zfc文本; }
    public string Text { get; } // 只读
}

public class Publisher
{
    // 声明委托(如果使用非通用模式)
    public delegate void SampleEventHandler ( object sender , SampleEventArgs e );

    // 声明事件
    public event SampleEventHandler SampleEvent;

    // 将事件包装在受保护的虚拟方法中,以使派生类能够引发事件
    protected virtual void RaiseSampleEvent ( )
    {
        // 方法以线程安全的方式引发事件或操作符。
        SampleEvent? . Invoke ( this , new SampleEventArgs ( "Hello" ) );
    }
}

事件是一种特殊的多播委托,仅可以从声明事件的类(或派生类)或结构(发布服务器类)中对其进行调用。 如果其他类或结构订阅该事件,则在发布服务器类引发该事件时,将调用其事件处理程序方法。

可以将事件标记为 public、private、protected、internal、protected internal 或 private protected。 这些访问修饰符定义该类的用户访问该事件的方式。

关键字和事件

下列关键字应用于事件。

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

可以通过使用 static 关键字将事件声明为 static 事件。这可使事件可供调用方在任何时候进行调用,即使不存在类的实例。

可以通过使用 virtual 关键字将事件标记为虚拟事件。这可使派生类使用 override 关键字重写事件行为。重写虚拟事件的事件也可以为密封,指定对于派生类,它不再是虚拟的。最后,可以声明事件为 abstract,这意味着编译器将不会生成 add 和 remove 事件访问器块。因此,派生类必须提供其自己的实现。


兔子码农
4 声望1 粉丝

一个酒晕子