首先举一个实例:
创建一个控制台程序,需求是:有一只猫Tom,有两只老鼠Jerry和Jack,Tom只叫一声“喵,我是Tom”,两只老鼠就说“老猫来了,快跑”,我们来分析一下:
我们需要Cat和Mouse类两个类,当Cat的Shout方法触发的时候,Mouse就执行Run方法,不过这里如何让Shout触发式,通知两只老鼠呢?显然老猫不会通知老鼠“我来了,你们快跑”。
所以,我们在Cat类中,不应该关联Mouse类的。这个时候,委托事件就是最好的处理方法了。
委托是对函数的封装,可以当作方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事件时,时间对象处理通知过程。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托用关键字delegate来声明,而事件就是说在发生其他类或者对象关注事件时,类或对象可通过事件通知他们,事件的关键字 用event声明。

   1:      class Cat2 
   2:      { 
   3:          private string name; 
   4:          public Cat2(string name) 
   5:          { 
   6:              this.name = name; 
   7:          } 
   8:          public delegate void CatShoutEventHandler(); 
   9:          public event CatShoutEventHandler CatShout; 
  10:          public void Shout() 
  11:          { 
  12:              Console.Write("喵,我是{0}.", name); 
  13:              if (CatShout != null) 
  14:                  CatShout(); 
  15:          } 
  16:      } 
  17:   
  18:       class Mouse 
  19:      { 
  20:          private string name; 
  21:          public Mouse(string name) 
  22:          { 
  23:              this.name = name; 
  24:          } 
  25:          public void Run() 
  26:          { 
  27:              Console.WriteLine("老猫来了,{0}快跑!", name); 
  28:          } 
  29:      } 
  30:   
  31:          static void Main(string[] args)
  32:          {
  33:              Cat2 cat = new Cat2("Tom");
  34:              Mouse mouse1 = new Mouse("Jerry");
  35:              Mouse mouse2 = new Mouse("Jace");
  36:              cat.CatShout += new Cat2.CatShoutEventHandler(mouse1.Run);
  37:              cat.CatShout += new Cat2.CatShoutEventHandler(mouse2.Run);
  38:              cat.Shout();
  39:              Console.Read();
  40:          }

new Cat2.CatShoutEventHandler(mouse1.Run)的含义是实例化一个委托,而委托的实例其实就是Mouse的Run方法。而“cat.CahShout += ”表示

cat.add_CatShout(new Cat2.CatShoutEventHandler(mouse1.Run))的意思。
运行的结果:
 

我们平时在点击一个按钮的时候,通常看到这样子的东西:

private void button5_Click(object sender, EventArgs e)

这里的sender和e有什么用呢?
我们首先修改一下上面的例子

   1:      class Cat2
   2:      {
   3:          private string name;
   4:          public Cat2(string name)
   5:          {
   6:              this.name = name;
   7:          }
   8:          public delegate void CatShoutEventhandler(object sender, CatShoutEventArgs args);
   9:          public event CatShoutEventhandler CatShout;
  10:          public void Shout()
  11:          {
  12:              Console.Write("喵,我是{0}.", name);
  13:              if (CatShout != null)
  14:              {
  15:                  CatShoutEventArgs e = new CatShoutEventArgs();
  16:                  e.Name = this.name;
  17:                  CatShout(this, e);
  18:              }
  19:          }
  20:      }
  21:   
  22:      class Mouse
  23:      {
  24:          private string name;
  25:          public Mouse(string name)
  26:          {
  27:              this.name = name;
  28:          }
  29:          public void Run(object sender, CatShoutEventArgs args)
  30:          {
  31:              Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
  32:          }
  33:     }

Main函数不变。这个时候的结果是:

转载于:https://www.cnblogs.com/chenamo5776/archive/2011/11/13/2247177.html

面向对象基础-委托与事件相关推荐

  1. C#基础-委托与事件

    1.委托 委托(delegate)是一种数据结构,提供类似C++中函数指针的功能.不同的是,C++的函数指针只能够指向静态的方法,而委托除了可以指向静态的方法之外,还可以指向对象实例的方法.其实,最大 ...

  2. c# 创建委托 消息订阅_C#面向对象之委托和事件

    委托 1.定义:委托也叫代理,就是把事情交给别人来做. 2.声明委托语法: delegate 返回类型 委托名称(); 委托使用步骤 1.声明委托 public delegate int Calcul ...

  3. .NET基础示例系列之六:委托及事件

    委托是一个类. 定义委托时,实是定义一个用户自定义的类,它能代表具有相同参数列表和返回类型的任何方法,方法可以是静态方法或成员方法.示例: public partial class Form1 : F ...

  4. 【.NET基础】--委托、事件、线程(2)

    本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Delegate,然后在Button的后台事件中 新建 ...

  5. C#基础加强(8)之委托和事件

    委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...

  6. 3.0 面向对象 委托和事件 异常和错误

    一.委托和事件 委托和事件这两个概念是完全配合的.委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成.委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.事 ...

  7. [C#]委托和事件(讲解的非常不错)

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

  8. C#委托、事件、消息(入门级)

    本文的内容需要一定的OOP知识,不过我会在另一个内容介绍,由于实现细节,我会先写这部分. 大家关于委托.事件和消息大多是从WinForm编程接触的,首先是你在可视化的设计器里双击控件写所谓事件的处理代 ...

  9. C# 委托(Delegate) 事件(Event)应用详解

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

最新文章

  1. 转:mysql的日期/时间函数
  2. ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH
  3. 在ubuntu14.04 64位虚拟机中安装mysql
  4. LeetCode Implement Trie(Prefix Tree)
  5. 相交链表—leetcode160
  6. Mac 上 Sublime Text3-Package control-console安装失败解决方案
  7. mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】
  8. 运行opencv保存视频时出现错误的解决方法
  9. Set集合HashSet,TreeSet
  10. BZOJ 1053: [HAOI2007]反素数ant
  11. JSONP实现跨域(9种跨域方案)
  12. Python - 面向对象编程 - 公共属性、保护属性、私有属性
  13. 在Mac下,快速搭建针对WP8应用的PhoneGap开发环境
  14. 985学生:为什么现在学校还在教C语言?| 文末送书
  15. input 搜索localStorage存储历史记录 删除历史记录
  16. Linux内核4.14版本——mmc_blk层为sd card等创建、读写块设备流程
  17. 地图实时定位我的位置
  18. sails mysql_sails-mysql架构数据类型
  19. AE/PR插件AI智能背景抠像颜色键控GoodbyeGreenscreenzxb V1.6.0官方版
  20. 山也就只有这么高嘛。

热门文章

  1. 分组密码简介和五大分组模式
  2. python访问网页速度_python实现用于测试网站访问速率的方法
  3. mysql 异步_MySQL -- 异步I/O
  4. C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则
  5. leetcode300 最长上升子序列
  6. (十九)TCPIP面试宝典-进入大厂必备总结(上)
  7. IAP-应用内购买流程
  8. windows下关于Objective-C开发环境的配置
  9. 关于uint32_t uint8_t uint64_t 的问题
  10. python两个for循环为什么第二个循环里值不变_两个for循环,第二个只在第一个迭代python上执行...