码迷,mamicode.com
首页 > 其他好文 > 详细

委托和事件

时间:2015-03-29 12:13:29      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

 /*  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     }
View Code

 

委托和事件

标签:

原文地址:http://www.cnblogs.com/jj520/p/4375431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!