事件
事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。
事件的定义:
事件(event)是类或者对象对其他类或者对象通知发生的事情的一种特殊签名的委托。
事件的声明:
在一个委托类型前面加上关键字event,这个时候所声明出的委托类型变量就成为事件。
public event 委托类型 事件名;
事件使用event关键字来进行声明,返回值是一个 委托类型。
通常事件的命名,以名字+Event作为名称。在进行编码时,按照这样的规范可以增强代码的可读性。
example:
namespace LearnFirst
{
class Program
{
public delegate void MyDelegate();
public MyDelegate myDelegate; //声明了一个委托类型的变量, 作为类的成员
static void Test1()
{
Console.WriteLine("Test1");
}
static void Main(string[] args)
{
Program p = new Program(); //这里的类是Program类
p.myDelegate = Test1;
p.myDelegate();
}
}
}
namespace LearnFirst
{
class Program
{
public delegate void MyDelegate();
public event MyDelegate myDelegate; //声明了一个委托类型的变量——“事件”,作为类的成员
static void Test1()
{
Console.WriteLine("Test1");
}
static void Main(string[] args)
{
Program p = new Program();
p.myDelegate = Test1;
p.myDelegate();
}
}
}
上面两段代码,在功能实现上是一样的,用法也是完全一样的。
但是需要注意的是,委托类型是可以声明局部变量的,但事件只能在类的成员里进行声明。
事件与委托的联系和区别
- 事件是一种特殊的委托,或者说是一种受限制的委托,是委托的一种特殊应用。只能施加: “+=, -=”操作符。二者本质上是一种东西。
event ActionHandler Tick;
上述这条语句,会编译创建一个私有的委托示例,以及施加在上面的add(+=)和remove(-=)方法。- event只允许使用add和remove方法来进行操作,这就导致了它不允许类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发,但是不要这样使用。
- 使用中,委托常常用来表达回调,事件表达外发的接口。