C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用。有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床。

上面例子实际上包括2个类,一个是学生类(Student),一个是闹钟类(Ring)。此时,让我们仔细想想,当闹钟到点后如何通知学生呢?当然不要说,闹钟响了,学生能听到这样的话23333,现在是写程序,一切用程序说话。也就是说当时间到了,闹钟类里应该有个给学生发消息的方法(OnSendMessage()),学生类里会有处理这个消息方法(HandleEvent()),比如说起床。看似蛮对的,但是有一个问题,这不是实时通信程序,学生如何检测到闹钟发来的信息,从而去调用起床的方法呢?实际在程序中,我们是通过在闹钟类的发消息方法中调用学生类中的起床方法实现的。是不是有点乱了?那换句话说,就是当响铃这一事件被触发后,起床会自动发生。呃,不小心就把事件给说出来了,感觉自己有点啰嗦了。

那什么是委托,委托其实是一种编程技术,事件机制是委托这种技术的应用。简单的说,通过在声明个委托delegate,将HandleEvent()方法交给delegate,这样在闹钟类中就可以通过委托调用HandleEvent()方法了。

到这里有的朋友可能读懵了。不用担心,不懂可以先继续往下看。说下委托和事件各自的声明格式:

委托:[修饰符] delegate 返回类型 委托名(参数列表)
举例:

public delegate void RingHandler();

事件:[修饰符] event 委托名 事件名

举例:

public event RingHandler SendMessage;

根据上面的小例子,我们把代码实现,然后大家细细体会。

1、需要声明一个委托

public delegate void RingHandler();

需要注意2点,委托的声明在类外与类的声明并列。委托的返回类型和参数列表必须与需要被委托方法(HandleEvent())的返回类型和参数列表相同。

2、创建一个定义事件的类,即消息的发送方(Ring)。需要包含(1)与委托关联的事件(2)事件的触发方法

     public delegate void RingHandler();//注意返回类型和参数列表与事件处理方法返回类型和参数列表一致
public class Ring
{
public event RingHandler SendMessage;//与委托关联的事件,此时不懂没关系,知道是个事件就行。
public void OnSendMessage()//事件触发时调用的方法
{
SendMessage();
}
}

3、定义一个将方法连接到接收事件的上的类(Student)。需要包含(1)事件处理方法(2)将事件与事件处理方法相关联

    public class Student
{
public void HandleEvent()//事件处理方法
{
Console.WriteLine("该起床了");
}
public void Register(Ring ring)
{
ring.SendMessage += new RingHandler(HandleEvent);//此处注意事件注册或移除只能用+=/-=符号,不能用其他。括号里只需写上方法名即可
}
}

最后创建实例使程序运行,代码如下:

    class Program
{
static void Main(string[] args)
{
Ring ring = new Ring();
Student student = new Student();
student.Register(ring); if(GetTime() == )//如果时间是6点,就触发响铃方法。GetTime()不给实现了。
{
ring.OnSendMessage();
}
}
}

总结一下,事件的使用简单就是三点:(1)定义事件(2)注册事件(3)触发事件。大概就是这样使用的,但是在实际工作中,通常我们只需要完成事件处理方法中的代码,不必关心事件和委托的定义。

最新文章

  1. bootstrap-datetimepicker在火狐下报错的问题
  2. MIT研发的新型匿名网络Riffle,下一个Tor
  3. 渴切API参考手册
  4. 超棒的响应式设计测试书签和工具(bookmarks)(转)
  5. 上海9000辆出租车上铺设免费微信连WiFi
  6. springMVC+ibatis数据持久化入门级学习例子
  7. 【44】将与参数无关的代码抽离templates
  8. JQ异步调用
  9. Linux命令 — 设置或查看网络配置命令ifconfig
  10. TypeUtils -- Object 转为 强类型
  11. ERP的基础管理-物料编码
  12. Arduino LiquidCrystal Library Bug Report #174181
  13. Codeforces Round #423 B. Black Square
  14. 国内5家云服务厂商 HTTPS 安全性测试横向对比
  15. spring mvc+mybatis+maven集成tkmapper+pagehelper
  16. 关于.Net mvc 项目在本地vs运行响应时间过长无法访问时,解决方法!
  17. Vue-admin工作整理(六):路由元信息
  18. js之跑马灯广告
  19. 三星S4 i9508 4.4.2 root 教程
  20. Java多线程-----原子变量和CAS算法

热门文章

  1. css3 animation动画使用
  2. Elasticsearch学习(4) spring boot整合Elasticsearch的聚合操作
  3. 【OCP-12c】CUUG 071题库考试原题及答案解析(16)
  4. springmvc 通过@ResponseBody 返回json的中文乱码解决方案2个
  5. eclipse如何汉化,把eclipse改成中文版
  6. 5. STL编程五
  7. Python 全栈开发:dict(字典)常用方法操作、dict嵌套
  8. c# 命名空间别名
  9. MVC3权限验证,诡异的OnAuthorization
  10. (转)DB2和 Oracle的并发控制(锁)比较