事件是一种特殊的委托,本质上来讲事件就是委托。
事件是在委托类型变量前加上event
关键字,其本质是用来对委托类型的变量进行封装,类似于类的属性对字段的封装。事件是对类的引用可以把事件看作一个类,当使用事件的时候需要先声明一个委托的字段,委托字段可以是匿名方法也可以是带参数的方法,但是委托字段的方法关键字必需是void声明的实例方法,声明的事件的字段的关键字使用static关键字定义的静态方法再加上event关键字,后面在加上委托定义的方法最后在加上一个事件的执行方法;
代码实例如下:
声明的代理的字段和声明的关键字的字段必须放在同一个类里面
public class WaterTest {
public delegate void WaterDelegate(int a);
public static event WaterDelegate waterDelegateEvent;
public static void WaterTestMothod()
{
for (int i = 0; i < 100; i++) {
if (i >=90)
{
waterDelegateEvent(i);
}
}
}
}
事件使用时必须要在事件之前使用委托,事件可以使用委托的多播的属性进行调用方法,但是事件可以直接使用+=链接两个方法而不需要先使用=链接一个方法。委托可以使用=
和+=
来将函数注册到委托的变量上,使用-=
来将函数注销。而事件则有着更严格的限制,事件只能使用+=
来将函数注册到其上,使用-=
来将函数注销。
在使用事件的时候需要给事件进行绑定,调用不需要new类的实例直接使用类名调用事件的名称即可,然后通过+=为事件进行注册委托,如果需要执行的方法和事件不是同一个类那么就需要在进行事件委托的时候在+=的后面加上需要调用方法的类名, 然后在用类名打点调用要执行事件的方法名。
代码如下:
namespace ProgramEvnet
{
internal class Program
{
static void Main(string[] args)
{
//绑定事件的方法
WaterTest.waterDelegateEvent += Water1;
WaterTest.waterDelegateEvent += Water2;
WaterTest.waterDelegateEvent += Test1.Water3; //执行烧水方法
WaterTest.WaterTestMothod();
Console.ReadKey();
}
public static void Water1(int a) {
Console.WriteLine($"水温度:{a}度,可以用杯子接水了");
}
public static void Water2(int a) {
Console.WriteLine($"水温度:{a}度,可以用桶接水了");
}
}
class Test1 {
public static void Water3(int a)
{
Console.WriteLine($"水温度:{a}度,可以用盆接水了");
}
}
public class WaterTest {
public delegate void WaterDelegate(int a);
public static event WaterDelegate waterDelegateEvent;
public static void WaterTestMothod()
{
for (int i = 0; i < 100; i++) {
if (i >=90)
{
waterDelegateEvent(i);
}
}
}
}
}