委托的应用之事件

前言

  上一个章节介绍了委托,这里我们再通过一个例子继续巩固一下委托的用法并引入事件的用法  。

  为了便于理解,这里还是引入一个很老的例子:

因为一只猫叫了一声 接着老鼠被吓跑 小孩哭也了起来 最后妈妈也被吵醒。

下面用代码来实现这些功能

 1     /// <summary>
 2     /// 猫类
 3     /// </summary>
 4     public class Cat
 5     {
 6         /// <summary>
 7         /// 猫叫的方法
 8         /// </summary>
 9         public void Miao()
10         {
11             Console.WriteLine("猫喵了一声");
12
13             new Mouse().Run();
14             new Baby().Cry();
15             new Mother().Awake();
16         }
17     }
18
19
20     /// <summary>
21     /// 老鼠类
22     /// </summary>
23     public class Mouse
24     {
25         /// <summary>
26         /// 老鼠跑的方法
27         /// </summary>
28         public void Run()
29         {
30             Console.WriteLine("老鼠开始跑");
31         }
32     }
33
34    /// <summary>
35     /// 小孩类
36     /// </summary>
37     public class Baby
38     {
39         /// <summary>
40         /// 小孩哭的方法
41         /// </summary>
42         public void Cry()
43         {
44             Console.WriteLine("婴儿哭了起来");
45         }
46     }
47
48     /// <summary>
49     /// 妈妈类
50     /// </summary>
51     public class Mother
52     {
53         /// <summary>
54         /// 妈妈醒的方法
55         /// </summary>
56         public void Awake()
57         {
58             Console.WriteLine("妈妈被吵醒了");
59         }
60     }
61
62    class Program
63     {
64         static void Main(string[] args)
65         {
66             {
67                 //直接调用
68                 new Cat().Miao();
69             }
70             Console.ReadLine();
71         }
72     }

  代码写完了,功能完成了 。

  那么问题还是那个问题:耦合,依赖,不扩展,增加类的动作或者调整顺序都会导致Cat类被修改。

  为解决这一问题 还是用前面用的委托(上一章就是学习的委托的接解藕功能),

  代码如下:

  在Cat类声明一个委托

 1    //这里定义一个委托
 2     public delegate void MiaoHandel();
 3
 4     /// <summary>
 5     /// 猫类
 6     /// </summary>
 7     public class Cat
 8     {
 9         /// <summary>
10         /// 猫叫的方法
11         /// </summary>
12         public void Miao()
13         {
14             Console.WriteLine("猫喵了一声");
15         }
16     }

  外面再给委托添加后和删除方法,还可以任意调整顺序且不用修改Cat类。

class Program
    {
        static void Main(string[] args)
        {
            {
                //直接调用
                new Cat().Miao();
            }
            Console.WriteLine("--------------------------------");
            {
                //用委托来调用
              MiaoHandel miaoHandel=new MiaoHandel(new Cat().Miao);
              miaoHandel += new Mouse().Run;
              miaoHandel += new Baby().Cry;
              miaoHandel += new Mother().Awake;
              //还可以通过-=来删除方法
              miaoHandel -= new Mother().Awake;
              miaoHandel.Invoke();
            }
            Console.ReadLine();
        }
    }

  说到这儿,那么到底什么是事件呢?

  其实前面我讲了委托是一个类,那么事件就是委托的一个实例,加了一个event关键字。

  那要说委托与事件的区别。本质上就是类跟实例的区别了。

  来我们还是来看看代码

  先在Cat类定义一个事件

 1    //这里定义一个委托
 2     public delegate void MiaoHandel();
 3
 4     /// <summary>
 5     /// 猫类
 6     /// </summary>
 7     public class Cat
 8     {
 9         /// <summary>
10         /// 猫叫的方法
11         /// </summary>
12         public void Miao()
13         {
14             Console.WriteLine("猫喵了一声");
15         }
16
17         public event MiaoHandel MiaoHandelEvent;
18     }

主程序里面就用我们自己定义的委托的实例(事件)来调用

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             {
 6                 //直接调用
 7                 new Cat().Miao();
 8             }
 9             Console.WriteLine("--------------------------------");
10             {
11                 //用委托来调用
12                 Cat cat = new Cat();
13                 cat.MiaoHandelEvent = new MiaoHandel(new Cat().Miao); //报错了:这里不能直接赋值
14                 cat.MiaoHandelEvent += new Mouse().Run;
15                 cat.MiaoHandelEvent += new Baby().Cry;
16                 cat.MiaoHandelEvent += new Mother().Awake;
17                 //还可以通过-=来删除方法
18                 cat.MiaoHandelEvent -= new Mother().Awake;
19                 cat.MiaoHandelEvent.Invoke(); //报错了:这里不能直接赋
20             }
21             Console.ReadLine();
22         }
23     }

  改成事件之后 ,我们会发现 事件是不能被赋值和调用的,这样做的好处就是 出于安全性的考虑,可以控制权限,外面不能赋值/调用。

  那么要使用事件就必须在这个事件的发起者内部定义调用的方法。再来看看 修改之后最终的代码

  

  猫类的方法

 1 namespace DelegateEventDemo
 2 {
 3     //这里定义一个委托
 4     public delegate void MiaoHandel();
 5
 6     /// <summary>
 7     /// 猫类
 8     /// </summary>
 9     public class Cat
10     {
11         /// <summary>
12         /// 猫叫的方法
13         /// </summary>
14         public void Miao()
15         {
16             Console.WriteLine("猫喵了一声");
17         }
18
19         public event MiaoHandel MiaoHandelEvent;
20
21         /// <summary>
22         /// 事件的调用方法
23         /// </summary>
24         public void MiaoHandelEventInvoke()
25         {
26             if (this.MiaoHandelEvent != null)
27             {
28                 MiaoHandelEvent.Invoke();
29             }
30         }
31     }
32 }

  最终调用

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             {
 6                 //直接调用
 7                 new Cat().Miao();
 8             }
 9             Console.WriteLine("--------------------------------");
10             {
11                 //用委托来调用
12                 Cat cat = new Cat();
13                 cat.MiaoHandelEvent += new Cat().Miao;
14                 cat.MiaoHandelEvent += new Mouse().Run;
15                 cat.MiaoHandelEvent += new Baby().Cry;
16                 cat.MiaoHandelEvent += new Mother().Awake;
17
18                 cat.MiaoHandelEventInvoke();
19             }
20             Console.ReadLine();
21         }
22     }

总结

委托与事件的区别:

  1. 委托是一个类型,事件就是委托的一个具体实例,加上一个event关键字

  2. 委托可以直接赋值和调用。而事件不能直接被赋值和调用, 这是出于安全性的考虑。

时间: 2024-08-15 08:44:59

委托的应用之事件的相关文章

JQ事件委托导致点击事件多次执行问题

起因:最近写网页其中一个模块使用tab切换~每一个tab里都有点击按钮提交事件,刚开始点击提交只执行一次,但是只要我tab切换页面又切换回来该页面,再点击该按钮,我切换了多少次页面,代码提交也会提交很多次: 原因:后来找了一下原因,得知是因为JQ事件委托导致点击事件多次执行的(事件委托是指:利用事件冒泡,指定一个事件处理程序来管理某一类型的所有事件),虽然我页面切换了,但是事件问题还在,所以才会点击一次执行多次: 解决方法:使用off()函数移除之前添加的事件处理程序,就能解决该问题. eg:

对事件委托绑定click的事件的解绑

大家都知道解绑事件的jquery写法,很简单: $("xxx").unbind("click"); 然后对于事件委托式的事件绑定,亲测,这种解绑方法是无效的, $(".sideNav>ul").on("click", function (e) {     alert("aaa"+$(e.tagert).index()); } 即使做判断让一部分带有某个class的li标签的ul解绑click,依然无效

委托、Lambda和事件

委托 委托相当于C语言当中的函数指针,不过委托是类型安全的类,它定义了返回类型和参数的类型. 声明委托 在C#中使用一个类,分为两个阶段.首先,需要定义这个类,告诉编译器这个类由什么字段和方法组成,然后实例化这个类的一个对象.使用委托也要经过这两个步骤.首先,定义要使用的委托(类),告诉编译器这委托(类)表示的是哪种类型的方法,然后创建委托的实例.它们都是要即先声明,再实例化.只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托. 1 //定义IntMethodInvoker委托类

JQuery的事件委托;jQuery注册事件;jQuery事件解绑

一.事件 ①事件委托:就是给子元素的父元素或者祖先元素注册一个事件,但是事件的执行者是子元素,委托事件的好处是能够给动态创建出来时元素也加上事件. ②简单事件:就是给自己注册事件自己执行动态创建出来的事件不会有事件. ③使用方法:$("span").on("click",function(){alert("这是一个简单事件");}): $("div").on("click", "span"

【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜

先看看解析,事件委托:也称事件代理 就是利用冒泡的原理 把加事件加到父级上,触发执行效果

window.onload = function(){ var oUl = document.getElementById('ull'); var aLi = document.getElementsByTagName('li'); oUl.onmouseover = function(ev){ var event = ev||window.event; // 获取event对象 var target = ev.target || ev.srcElement; // 获取触发事件的目标对象 if

[JS]笔记14之事件委托

-->什么是事件委托-->事件委托原理-->事件委托优点-->事件源 / 目标源 一.什么是事件委托 通俗的讲,onclick,onmouseover,onmouseout等这些就是事件 委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等

委托与事件

委托在底层就是一个函数的指针,委托是事件的基础. 你可以传递引用类型.值类型.但是你有没有需要传一个方法呢?传方法的过程就是委托. 消息类: public class Message { /// <summary> /// 传引用类型 /// </summary> /// <param name="msg"></param> public static void Send(string msg) { Console.WriteLine(&