事件是使对象能够触发通知的成员。事件用户可以通过提供事件处理程序为事件附加可执行代码。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 事件访问器块。因此,派生类必须提供其自己的实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。