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. 输出结果

最新文章

  1. 安装eclipse的maven插件
  2. Base64编码【转】
  3. CharacterEncodingFilter-Spring字符编码过滤器
  4. openfire更改数据库
  5. centos7下使用yum安装mysql数据库以及设置远程访问
  6. Python的列表推导式
  7. Shapefile文件中的坐标绘制到屏幕时的映射模式设置
  8. Office365 InfoPath 表单的设计和应用(原创)
  9. 分享一个3D球面标签云
  10. 转: seajs手册与文档之 -- require规则
  11. 开发者:网站 &amp; SDK
  12. Python的进程与线程--思维导图
  13. 快速开发跨平台应用之Xamarin技术
  14. JDK8新特性02 Lambda表达式02_Lambda语法规则
  15. C++ MFC棋牌类小游戏day4
  16. hdu 5055
  17. python 字典,元组,对象,数组取值方法
  18. 链家鸟哥:从留级打架问题学生到PHP大神,他的人生驱动力竟然是?
  19. liunx 命令大全
  20. php获取当前日期开始一周日期与星期几

热门文章

  1. Solution -「NOI 2020」「洛谷 P6776」超现实树
  2. SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现
  3. 个人觉得好用的Idea插件
  4. CPU平均负载率之stress模拟CPU密集型进程
  5. JVM学习——类加载机制(学习过程)
  6. 2020年的第一天-我的IDEA出现This license ... has been cancelled
  7. 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
  8. 使用helm安装ingress,实现用域名的方式访问k8s内部应用
  9. C# Semaphore 信号量 锁 简单理解
  10. C#操作WMI指南