一、定义
事件是两个对象间发布消息和响应后处理消息的过程,通过委托类型来实现的。
事件的机制被称为发布-订阅机制,其算法过程为:首先定义一个委托类型,然后在发布者类中声明一个event事件,同时此类中还有一个用来触发事件的的方法,通过此方法来关联事件。声明订阅者类,其中定义一个被调用方法,最后在主函数中完成事件的关联和对方法的调用。
二、示例
1. 无参委托类型
举个简单的例子,我委托女朋友给我买东西,那我需要定义一个发布者类Me和一个订阅者类Girlfriend。🐶
public class Me//发布者是我,hehe
{
public delegate void Buyfoodforme();//定义委托类型
private int a;
public event Buyfoodforme Buy;//基于委托类型定义事件
public void Linkevent()
{
if (Buy != null)
{
Buy();
}
else
{
Console.WriteLine("回来吧,我不想买了");
Console.ReadKey();//按回车继续
}
}
public Me() //定义构造函数,单纯试验下
{
int a = 6;
GetState(a);
}
public void GetState(int b)
{
if (a != b)
{
a = b;
Linkevent();
}
}
}
public class Girlfriend//订阅者。。
{
public void Runtobuy()
{
Console.WriteLine("我要赶紧跑步去买,嘻嘻");
Console.ReadKey();
}
}
在主函数中关联事件
public class Program
{
public static void Main()
{
Me me = new Me();//创建对象,同时调用构造函数Me,输出"回来吧,我不想买了"
Girlfriend gf = new Girlfriend();
me.Buy += new Me.Buyfoodforme(gf.Runtobuy);//关联被调用事件
me.GetState(1);
}
}
2. 有参委托类型
using System;
namespace Event1
{
public delegate int NumManipulationHandler(int a, int b);
//发布者类
public class EventTest
{
//声明事件
public event NumManipulationHandler Numevent;
int a = 1;
int b = 1;
//触发事件的函数
public void OnNumChanged()
{
Numevent?.Invoke(a, b);//空检查运算符
}
}
//订阅者类
public class Suber
{
public int Sum(int a, int b)
{
Console.WriteLine("Subscriber the changed number is {0}", a + b);
return a + b;
}
public int Sub(int a, int b)
{
Console.WriteLine("Subscriber the changed number is {0}", a - b);
return a - b;
}
}
class Program
{
static void Main(string[] args)
{
EventTest e = new EventTest();
Suber s = new Suber();
e.Numevent += s.Sum;//注册方法
e.Numevent += s.Sub;
e.OnNumChanged();//触发事件
}
}
}
定义一个事件有两步,首先定义一个委托,它包括了这件事的“协议”和委托方法(由谁去做);其次,用event关键字和相关委托声明这个事件。事件像是一个接口,封装了委托所定的“协议”。由于委托已经定义了协议,剩下的就是按这个协议去办事,至于怎么做它并不关心。