类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送事件的类称为“发行者”,接收事件的类称为“订阅者”。 事件基于委托。
声明一个事件: public event Action 事件名称;
对事件添加订阅: 事件名称 += 要添加的方法名。
对事件取消订阅: 事件名称 -= 要取消的方法名。取消所有的方法后,事件会置为null。
**事件的调用: ** 事件名称(); 事件的调用只能在声明事件的类中调用,不可在该类之外调用。
学校有上课铃和下课铃。 当老师听到上课铃后,给学生开始讲课,让学生听讲。 当老师听到下课铃后,停止讲课,开始休息,并让学生休息。
接口可声明事件。 下面的示例演示如何在类中实现接口事件。
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;
}
}
下面的示例演示如何处理以下的不常见情况:您的类是从两个以上的接口继承的,每个接口都含有同名事件)。 在这种情况下,您至少要为其中一个事件提供显式接口实现。 为事件编写显式接口实现时,必须编写 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;
}