1. 简介:
类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送事件的类称为“发行者”,接收事件的类称为“订阅者”。
事件基于委托。
2. 事件概述
发行者确定何时引发事件;订阅者确定对事件作出何种响应。
一个事件可以有多个订阅者。订阅者可以处理来自多个发行者的多个事件。
没有订阅者的事件永远也不会引发。
事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。
当事件具有多个订阅户时,引发该事件时会同步调用事件处理程序。
在 .NET Framework 类库中,事件基于 EventHandler委托和 EventArgs基类。
3. 订阅和取消事件
声明一个事件: public event Action 事件名称;
对事件添加订阅: 事件名称 += 要添加的方法名。
对事件取消订阅: 事件名称 -= 要取消的方法名。取消所有的方法后,事件会置为null。
**事件的调用: ** 事件名称(); 事件的调用只能在声明事件的类中调用,不可在该类之外调用。
4. 事件案例
学校有上课铃和下课铃。
当老师听到上课铃后,给学生开始讲课,让学生听讲。
当老师听到下课铃后,停止讲课,开始休息,并让学生休息。
5. 为接口添加事件
接口
可声明事件
。 下面的示例演示如何在类中实现接口事件。
public interface Interface1
{
event Action Test1;
}
public class Person : Interface1
{
public string name;
private int age;
public event Action Test1;
public override string ToString()
{
if(Test1 != null)
{
Test1();
}
return this.name;
}
}
6、两个接口中有相同事件
下面的示例演示如何处理以下的不常见情况:您的类是从两个以上的接口继承的,每个接口都含有同名事件)。 在这种情况下,您至少要为其中一个事件提供显式接口实现。 为事件编写显式接口实现时,必须编写 add和 remove事件访问器。 这两个事件访问器通常由编译器提供,但在这种情况下编译器不能提供。
public interface Interface1
{
event Action Test1;
}
interface Interface2
{
event Action Test1;
}
public class Person : Interface1 , Interface2
{
private object lockObj = new object();
public event Action inter1Test1;
event Action Interface1.Test1
{
add
{
lock (lockObj)
{
inter1Test1 += value;
}
}
remove
{
lock (lockObj)
{
inter1Test1 -= value;
}
}
}
public event Action Test1;
}
** 本章完结**