Net中事件的用法之一
1.事件与委托的关系
委托是一种类型
事件是委托的一个实例
事件中涉及两种角色——事件发布者和事件订阅者。
事件发布者: 触发事件的对象称为事件发布者。
事件订阅者: 捕获事件并对其做出处理的对象称为事件订阅者。
2.事件的实例说明
namespace MyEvent { //委托的声明 public delegate void DoSometing(); /// <summary> /// 委托与事件的关系 /// 委托是一种类型 /// 事件是委托的一个实例 /// </summary> public class MyEvent { public DoSometing doSomethingDelegate;//委托的一个变量 public event DoSometing doSomethingEvent;//一个事件,就是委托的一个变量,加上了event关键字 //事件的使用 public void Invoke() { if (doSomethingEvent != null) { doSomethingEvent(); } } } } namespace MyEvent { class Program { static void Main(string[] args) { Console.WriteLine("欢迎来到流星小子博客学习"); MyEvent myEvent = new MyEvent(); // myEvent.doSomethingEvent += new DoSometing(ShowSomething); myEvent.doSomethingEvent += ShowSomething;//为事件实例化 myEvent.Invoke();//触发事件 Console.Read(); } private static void ShowSomething() { Console.WriteLine("ShowSomething"); } } }
3. 事件的发布者与订阅者实例
//新郎官,充当事件发布者角色
public class Bridegroom
{
//自定义委托
public delegate void MarryHandler(string msg);
//定义事件
public event MarryHandler MarryEvent;
//发布事件
public void OnMarriageComing(string msg)
{
if(MarryEvent != null)
{
MarryEvent(msg);
}
}
}
public class Friend
{
//属性
public string Name { get; set; }
//构造函数
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合 MarryHandler委托的定义
public void SendMessage(string message)
{
//输出通知信息
Console.WriteLine(message);
//对事件做出处理
Console.WriteLine(this.Name + "收到了,到时候准时参加");
}
}
static void Main(string[] args)
{
Bridegroom bridegroom = new Bridegroom();
Friend friend1 = new Friend("张三");
Friend friend2 = new Friend("李四");
Friend friend3 = new Friend("王五");
//使用 “+=” 来订阅事件
bridegroom.MarryEvent += new Bridegroom.MarryHandler(friend1.SendMessage);
bridegroom.MarryEvent += friend2.SendMessage;
//发出通知,此时只有订阅了事件的对象才能收到通知
bridegroom.OnMarriageComing("朋友门,我要结婚了,到时候准时参加婚礼!");
Console.WriteLine("---------------------------------------------");
//使用 “-=” 来取消事件订阅,此时李四将收不到通知
bridegroom.MarryEvent -= friend2.SendMessage;
//使用 “+=” 来订阅事件,此时王五可以收到通知
bridegroom.MarryEvent += friend3.SendMessage;
//发出通知
bridegroom.OnMarriageComing("朋友门,我要结婚了,到时候准时参加婚礼!");
Console.Read();
}
4. 输出结果


浙公网安备 33010602011771号