我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。

  委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。

  下面是最近写的一个例子,相信能够加深大家对委托和事件的理解。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7. //声明一个委托
  8. public delegate void TimeEventHandler(object obj, TimeEventArgs args);
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. Clock clock = new Clock(); //实例化一个时钟
  14. MyClassEventHandler tehc = new MyClassEventHandler(); //实例化一个观察者类
  15. //将事件跟我们定义的观察者进行连接
  16. //这样,clock就会知道,每当TimeChanged事件被触发,就会去通知这个观察者
  17. //注意我们连接的时候使用的并不是直接的观察者类实例中的ShowTime()方法
  18. //而是一个委托,并在这个委托中传递ShowTime()方法,这也是"委托"的真正意义所在:
  19. //我有一个方法,但我委托你来帮我关联到事件,因为事件只会直接跟委托打交道,
  20. //而不是观察者的具体某个方法
  21. clock.TimeChanged += new TimeEventHandler(tehc.ShowTime);
  22. clock.go();
  23. }
  24. }
  25.  
  26. //TimeEventArgs是我们自己定义的一个类,用于保存事件中的参数.这里我们分别保存时间的时分秒
  27. public class TimeEventArgs:EventArgs
  28. {
  29. private int hour;
  30. private int minute;
  31. private int second;
  32. public TimeEventArgs(int hour,int minute,int second)
  33. {
  34. this.hour = hour;
  35. this.minute = minute;
  36. this.second = second;
  37. }
  38. public int Hour{
  39. get {
  40. return this.hour;
  41. }
  42. }
  43. public int Minute {
  44. get {
  45. return this.minute;
  46. }
  47. }
  48. public int Second {
  49. get {
  50. return this.second;
  51. }
  52. }
  53. }
  54. //观察者类,它有一个符合我们上面定义的"委托"的方法
  55. //也就是void ShowTime(object obj,TimeEventArgs args)
  56. //从这个方法的定义可以看到,我们只会关心返回类型和方法的参数,而方法名称则无所谓
  57. class MyClassEventHandler
  58. {
  59. public void ShowTime(object obj,TimeEventArgs args)
  60. {
  61. Console.WriteLine("现在时间:"+args.Hour+":" + args.Minute + ":" + args.Second);
  62. }
  63. }
  64.  
  65. //时钟类
  66. class Clock
  67. {
  68. //我们在这个类中定义了一个"TimeChanged"事件,注意其前面有两个关键字"event"和"TimeEventHandler"
  69. //其中event表示这是一个事件,而不是方法或属性,TimeEventHandler则指出,谁要监听TimeChanged事件,它就必须有一个符合TimeEventHandler(委托)的方法
  70. public event TimeEventHandler TimeChanged;
  71. public Clock()
  72. {
  73. //注意,这里的null的含义是指TimeChanged事件当前还没有观察者关注它
  74. //如果某个观察者要关注TimeChanged事件,它必须要让这个事件知道,方法是使用操作符"+="来借助委托将其加载到事件上
  75. TimeChanged = null;
  76. }
  77.  
  78. //时钟开始走动,我们的目标是每秒钟触发一次TimeChanged事件
  79. public void go()
  80. {
  81. DateTime initi = DateTime.Now;
  82. int h1 = initi.Hour;
  83. int m1 = initi.Minute;
  84. int s1 = initi.Second;
  85. while (true)
  86. {
  87. DateTime now = DateTime.Now;
  88. int h2 = now.Hour;
  89. int m2 = now.Minute;
  90. int s2 = now.Second;
  91. if (s2 != s1)
  92. {
  93. h1 = h2;
  94. m1 = m2;
  95. s1 = s2;
  96. //首先建立一个TimeEventArgs对象来保存相关参数,这里是时分秒
  97. TimeEventArgs args = new TimeEventArgs(h2, m2, s2);
  98. //注意这种写法,这一句是用来触发事件,事件不是类,所以不用使用"new"关键字,而且我们看到,这里TimeChanged的两个参数跟我们的委托(TimeEventHandler)是一致的
  99. //其中第一个参数是触发这个事件的对象,我们这里使用的是一个时钟实例(this)
  100. TimeChanged(this, args);
  101. }
  102. }
  103. }
  104. }
  105. }

转载自:http://ruizhinet.blog.163.com/blog/static/99213828200901110564999/

C#委托和事件例析的更多相关文章

  1. 再谈C#委托与事件

    之前写过一篇关于C#委托与事件的文章(见<C#委托和事件例析>),不过还是收到一些网友的提问.所以,今天再换另一个角度来详解一下这个问题. 一.在控制台下使用委托和事件 我们都知道,C#中 ...

  2. CS中委托与事件的使用-以Winform中跨窗体传值为例

    场景 委托(Delegate) 委托是对存有某个方法的引用的一种引用类型变量. 委托特别用于实现事件和回调方法. 声明委托 public delegate int MyDelegate (string ...

  3. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  4. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  5. C#之委托与事件

    委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...

  6. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  7. 《精通C#》委托与事件(10章)

    委托可用来解耦以及状态变化的实时通知,以及其他的一些作用,但是经验所限,目前还未遇见.网上的大多数例子都是类似于,使用委托,然后用console返回方法的返回值,有时候会在想,委托的通知如果是这样的话 ...

  8. C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

  9. [转]大白话系列之C#委托与事件讲解(三)

    本文转自:http://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html [我希望大家在看完文章的时候,多做做练习,自己也可以想个场 ...

随机推荐

  1. es6函数的新语法

    函数的默认值 function(x,y=10){ //赋予了y就有了默认值为10,如果y赋值了,就回被覆盖,否则就是默认值10 变量已经有默认值了,所以不用再次用let或者const声明啦 }

  2. C# 编码标准(一)

    一直想写一个自己用的代码标准,经过一段时间的优秀开源源码的观察和看其他人写的标准,感觉好的代码给人感觉就是舒服,也非常重要.所以把它们记录归纳总结,以备以后忘记,另外平时写代码的时候可以拿来参考下.下 ...

  3. 20155205 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155205 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一:打开mac下的 ...

  4. SSM_CRUD新手练习(2)配置文件

    配置之前现需要引入依赖的jar包: *Spring *SpringMvc *Mybatis *数据库连接池,驱动包 *其他(jstl,Servlet ,Junit..) 1.poxm.xml < ...

  5. C语言中:static与extern对变量和函数的作用

    1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...

  6. yum-本地源配置(CentOS7)

    服务器版本查看:# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 一.挂载ISO文件: 1.ISO镜像下载网站:网易镜像: ...

  7. windows安装mysql 5.7

    1.下载mysql 5.7 压缩包,解压在D:\software\mysql\目录下,更名称mysql-5.7.22 ,并新建data空文件夹和my.ini文件 my.ini文件的内容 [client ...

  8. Delphi XE3写DLL,用Delphi7调用,报错!

    http://bbs.csdn.net/topics/390870532 用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没 ...

  9. Linux下SVN配置hook经验总结

    前几天给实验室搭建了一个内部测试的开发环境,LAMP.svn提交以及自动部署. 之前没干过这事儿,到最终搞定还是颇费了些周折.总结一下我的经验,主要是hook的自动执行问题. 拿我的post-comm ...

  10. GeneralizedLinearAlgorithm in Spark MLLib

    GeneralizedLinearAlgorithm SparkMllib涉及到的算法 Classification Linear Support Vector Machines (SVMs) Log ...