1.委托
关键字:delegate
使用delegate可以声明一个委托,
delegate void MyDelegate();
委托可以将它理解为一个数据类型,以后就可以用MyDelegate来声明具有这种签名的新委托。
=可以用来初始化,+=用来添加新的方法,-=用于删除。
static void Test1()
{
Console.WriteLine("Test1");
}
static void Test2()
{
Console.WriteLine("Test1");
}
private delegate void MyDelegate();
static void Main(string[] args)
{
MyDelegate de;
de = Test1;
de += Test2;
de -= Test2;
de(); //调用
}
2.事件
关键字:event
使用event来声明一个事件
event MyDelegate myEvent;
事件和委托的操作几乎一样,除了声明关键词不一样以外,添加和删除方法的操作都完全一样。
static void Test1()
{
Console.WriteLine("Test1");
}
static void Test2()
{
Console.WriteLine("Test1");
}
private delegate void MyDelegate();
private static event MyDelegate myEvent;
static void Main(string[] args)
{
myEvent = Test1;
myEvent += Test2;
myEvent -= Test2;
}
事件可以理解为封装后的委托,但它们之间还是有区别:
(1)声明的关键字不一样;
(2)委托可以在类外直接调用,但是事件只可以在类里调用,类外是不可以调用的。
委托和事件的作用:
一般我们会把委托和事件用来做事件监测。举个例子,我们制作了一个按钮,为这个按钮注册了一个事件,我们不知道也不用知道当点击了这个按钮后会发生什么事情,我们只需要提供这个事件接口,然后每当按钮被点击并且事件不为空就调用这个事件。之后可能会有其他的人把我们制作的按钮拿到他的工程里去使用。他希望点击按钮过后让他的场景开始生成,他就可以把他写好的方法添加到我们提供的事件接口里,这样就可以实现点击按钮就开始生成场景。之后他又希望按钮点击后音乐也可以响起,这样也可以把音乐响起的方法添加到事件中,按钮点击后在场景生成的同时音乐也会响起。
这就时委托和事件的妙用,我们不用知道我们的“按钮”到底需要实现什么,我们只需要提供这个事件变化,这样就可以完成事件的监测了。