标签:
/* 1 什么是委托?
* 简单的说:就是一个存放方法指针的一个容器。
* 详细点: 就是存放符合某种格式(方法签名)的方法指针的容器
* 2 委托的语法:
* 如何来声明一个委托,声明委托的关键字是 delegate
* eg: delegate 返回值类型 委托类型名(参数)
* 委托的本质就是一个类
*
* 3 委托对象的创建
* 因为委托的本质是一个类,故委托的创建和类是一样的 使用关键字 new 也可以不用使用new 直接给委托对象于之对应的方法 这种方式在后面的
* 学习中称之为 “语法糖”。
*
* eg1:
* DGSay dgs=new DGSay();
* eg2:
* DGSay dg=Say();
*
* 4 委托的调用
* dg.Invoke(参数) --括号中传入方法对应的参数,如果方法没有参数则可以不传, 在后面我们也可以直接
* dg() 这样来调用 像方法的调用一样 同样在括号里面传方法对应的参数 这其实也是一种 “语法糖”
*
* 5 委托还可以一次执行多个方法,我们又如何在委托中追加方法和删除方法的呢?
* 委托中追加方法和删除方法我们可以使用 += 和 -= 来向委托中加或减方法。
* eg:
* dg += SayHello;
* dg -= SayHello;
*
* 6 多播委托:通常将包含多个方法指针的委托称之为多播委托
* 注意:多播委托调用有返回值的时候,获得最后一个方法的返回值组合的委托必需是同一类型
*
* 7 为什么有委托?委托的最终目的是什么?
* 目的: a: 将方法作为参数和返回值传递-----函数式编程。 b:调用一个委托,执行多个方法 (这就是所谓的观察者模式) *
*
* 8 委托的缺点,委托并不是能很好的使用,委托也是有缺点的
* 缺点:不能够进行控制的缺点,eg:可以使用 Click=null 来清除注册的事件 还可以用Click() 来 “假冒” 事件的触发。
* 那么遇此问题该如何去解决呢? 这时 我们就需要引入 事件 这个概念。
* 1 : 将委托成员做成 private 然后增加 AddClickEventHandler 和 RemoveClickEventHandler 两个 public 方法
*
* 9 事件:Event
* 对委托变量的可访问性进行封装 -- 类似于 属性对 字段的 封装 (增强安全性)
* 语法:
* public delegate void DGSayHello(string name); //创建委托类
* public event DGSayHello dgHello; //创建事件委托
*
* ==》使用反编译工具可以很清楚的看到 event 代码编译的结果如下
*
* private DGSayHello dgHello; //私有委托变量
*
* public DGSayHello dgHello // 公有事件专有的操作属性
* {
* addon void add_dgHello(DGHello dgObj) //新增方法
* {
* this.dgHello+=dgObj;
* }
* removeon void remove_dgHello(DGHello dgObj)//移除方法
* {
* this.dgHello-=dgObj;
* }
* }
*
* 10 委托和事件的区别:(面试常问)
* 委托: 委托是类
* 事件: 是用来对委托的一种封装 类似于 属性对字段的封装
eg: 三击按钮
1 //三击委托 2 public delegate void DGTripleClick(); 3 4 /// <summary> 5 /// 三击按钮 6 /// </summary> 7 public class TripleButton:System.Windows.Forms.Button 8 { 9 /// <summary> 10 /// 事件:编译后,会生成 私有的 同名委托变量!和 公共的 Add和Remove方法,供外部注册方法使用! 11 /// 事件就是对 委托成员变量 的 一种封装!(类似于属性!) 12 /// </summary> 13 public event DGTripleClick TrilpeClick; 14 15 public TripleButton() 16 { 17 base.Click += TripleButton_Click; 18 } 19 20 int clickTimes = 1; 21 22 /// <summary> 23 /// 为 按钮父类 的 单击事件 注册了方法 24 /// </summary> 25 void TripleButton_Click(object sender, EventArgs e) 26 { 27 if (clickTimes < 3) 28 { 29 clickTimes++; 30 } 31 else { 32 //System.Windows.Forms.MessageBox.Show("客官,您点了三次了哦~~~~~~!"); 33 if (TrilpeClick != null) 34 { 35 TrilpeClick();//调用委托里的方法!实现程序员代码! 36 } 37 clickTimes = 1; 38 } 39 } 40 } 41 42 public class TripleButton1 43 { 44 /// <summary> 45 /// 使用 event关键字 来 限制 外部对 Click 的访问 46 /// </summary> 47 public event EventHandler Click; 48 49 //所谓的“事件”,从技术上讲,就是类似于属性的一种封装 50 //只不过 事件 是专门用来 封装 委托字段,并通过 +=/-= 来访问! 51 52 //private EventHandler Click; 53 //add方法 54 //remove方法 55 56 private string name; 57 public string Name 58 { 59 get { return name; } 60 set { name = value; } 61 } 62 63 }
标签:
原文地址:http://www.cnblogs.com/jj520/p/4375431.html