一、事件是什么
事件一共有两个角色:发布者、订阅者。
流程:
1.定义好发布者,定义好发布后要干的事。
2.订阅者开始订阅。
3.发布事件:凡是订阅了的,就会收到事件的通知,进行相关处理操作。
二、事件的本质
事件的本质是委托链。
代码1:自定义 委托类型实现事件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
//红包出现类,充当时间发布者
public class RedPaperPerson
{
//自定义委托
public delegate void RedPaperHandler();
//使用自定义委托类型定义事件,事件命名为MarryEvent
public event RedPaperHandler RedPaperEvent;
//发出时间
public void SendRedPaper(string msg)
{
//输出信息
Console.WriteLine(msg);
//判断是否绑定了事件处理方法
if (RedPaperEvent != null)
{
//触发事件
RedPaperEvent();
}
}
}
class Program
{
static void Main(string[] args)
{
//初始化红包对象
RedPaperPerson redpaperperson = new RedPaperPerson();
//实例化抢红包的人
Person person1 = new Person("小韩");
Person person2 = new Person("小日");
Person person3 = new Person("小菲");
//订阅事件
//活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person1.SendMessage);
redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person2.SendMessage);
//发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
redpaperperson.SendRedPaper("低调的发了个红包");
Console.WriteLine("---------------------------");
//取消订阅事件
redpaperperson.RedPaperEvent -= new RedPaperPerson.RedPaperHandler(person2.SendMessage);
//订阅事件
redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person3.SendMessage);
//再发一个红包
redpaperperson.SendRedPaper("低调的发了个红包");
Console.Read();
}
}
class Person
{
//字段
public string Name;
//构造函数
public Person(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合RedPaperHandler委托的定义
public void SendMessage()
{
//对事件作出处理
Console.WriteLine(this.Name + "哈哈,已经抢到红包");
}
}
}
代码2:EventHandler实现事件
//红包出现类,充当时间发布者
public class RedPaperPerson
{
//使用自定义委托类型定义事件,事件命名为MarryEvent
public event EventHandler RedPaperEvent;
//发出时间
public void SendRedPaper(string msg)
{
//输出信息
Console.WriteLine(msg);
//判断是否绑定了事件处理方法
if (RedPaperEvent != null)
{
//触发事件
RedPaperEvent(this, new EventArgs());
}
}
}
class Program
{
static void Main(string[] args)
{
//初始化红包对象
RedPaperPerson redpaperperson = new RedPaperPerson();
//实例化抢红包的人
Person person1 = new Person("小韩");
Person person2 = new Person("小日");
Person person3 = new Person("小菲");
//订阅事件
//活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
redpaperperson.RedPaperEvent += new EventHandler(person1.SendMessage);
redpaperperson.RedPaperEvent += new EventHandler(person2.SendMessage);
//发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
redpaperperson.SendRedPaper("低调的发了个红包");
Console.WriteLine("---------------------------");
//取消订阅事件
redpaperperson.RedPaperEvent -= new EventHandler(person2.SendMessage);
//订阅事件
redpaperperson.RedPaperEvent += new EventHandler(person3.SendMessage);
//再发一个红包
redpaperperson.SendRedPaper("低调的发了个红包");
Console.Read();
}
}
class Person
{
//字段
public string Name;
//构造函数
public Person(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合RedPaperHandler委托的定义
public void SendMessage(object s, EventArgs e)
{
//对事件作出处理
Console.WriteLine(this.Name + "哈哈,已经抢到红包");
}
}
三、扩展EventArgs类实现:处理事件中的参数
代码3:事件传参数
//自定义事件类,并使其带有事件数据
public class RedPaperEventArgs : EventArgs
{
public string Message;
public RedPaperEventArgs(string msg)
{
Message = msg;
}
}
//红包出现类,充当时间发布者
public class RedPaperPerson
{
public delegate void EventHandler(object sender, RedPaperEventArgs e);
//使用自定义委托类型定义事件,事件命名为MarryEvent
public event EventHandler RedPaperEvent;
//发出事件
public void SendRedPaper(string msg)
{
//判断是否绑定了事件处理方法
if (RedPaperEvent != null)
{
//触发事件
RedPaperEvent(this, new RedPaperEventArgs(msg));
}
}
}
class Program
{
static void Main(string[] args)
{
//初始化红包对象
RedPaperPerson redpaperperson = new RedPaperPerson();
//实例化抢红包的人
Person person1 = new Person("小韩");
Person person2 = new Person("小日");
Person person3 = new Person("小菲");
//订阅事件
//活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person1.SendMessage);
redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person2.SendMessage);
//发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
redpaperperson.SendRedPaper("低调的发了个红包");
Console.WriteLine("---------------------------");
//取消订阅事件
redpaperperson.RedPaperEvent -= new RedPaperPerson.EventHandler(person2.SendMessage);
//订阅事件
redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person3.SendMessage);
//再发一个红包
redpaperperson.SendRedPaper("低调的发了个红包");
Console.Read();
}
}
class Person
{
//字段
public string Name;
//构造函数
public Person(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合RedPaperHandler委托的定义
public void SendMessage(object s, RedPaperEventArgs e)
{
//输出信息
Console.WriteLine(e.Message);
//对事件作出处理
Console.WriteLine(this.Name + "哈哈,已经抢到红包");
}
}