委托与事件——委托

  C#中的委托与事件是很重要的概念,要学好C#,必须冲破这一关。

1.委托  

  关键字delegate,委托,它与类、枚举、结构、接口一样,也是一种类型。

  由于委托是代表了一类具有相同参数列表和返回值的函数,委托定义的变量用于保存具有相同签名的函数实体,它可以指代任何函数。所以,我们说类是对象的抽象,那么委托就可以看成是函数的抽象。

  委托的好处:

    1.将方法动态地赋给参数,可以避免在程序中大量使用if-else(switch-case)语句,使程序具有良好的可扩展性。

    2.可以把函数本身的处理逻辑抽象出来,由调用者决定最终使用什么样的逻辑去处理。

  委托的用法,请看下面的代码

 1         //委托与类、枚举、结构、接口一样,也是一种类型
 2         //一个委托代表了具有相同参数列表和返回值的所有函数
 3         delegate int GetCalculatedValueDelegate(int x, int y);
 4         delegate void GreetingPeople();
 5
 6         static int AddValue(int x,int y)
 7         {
 8             return x + y;
 9         }
10
11         static int SubValue(int x, int y)
12         {
13             return x - y;
14         }
15
16         static int MulValue(int x, int y)
17         {
18             return x * y;
19         }
20
21         static void EnglishGreating()
22         {
23             Console.WriteLine("Hello");
24         }
25
26         static void ChineseGreeting()
27         {
28             Console.WriteLine("你好");
29         }
30
31         //委托作为函数的参数来使用
32         //一个委托实体可以指代任何函数
33         static int CalculateValue(GetCalculatedValueDelegate fun,int x,int y)
34         {
35             return fun(x, y);
36         }
37
38         static void Main(string[] args)
39         {
40             Console.WriteLine("委托作为参数来使用");
41             Console.WriteLine(CalculateValue(SubValue, 50, 20));
42
43             Console.WriteLine("委托使用 += 和 -=");
44             GetCalculatedValueDelegate de = new GetCalculatedValueDelegate(AddValue);
45             de += SubValue;
46             de -= AddValue;//取消对AddValue方法的绑定
47             Console.WriteLine(de(20, 20));
48
49             Console.WriteLine("给一个委托绑定多个方法");
50             GetCalculatedValueDelegate d = AddValue;//给委托赋值
51             d += SubValue; //给委托再绑定一个函数
52             d += MulValue; //给委托再绑定一个函数
53             Console.WriteLine(d(100, 30));
54
55             GreetingPeople greeting = null;
56             greeting += EnglishGreating;
57             greeting += ChineseGreeting;
58             greeting();
59         }

运行结果:

  因为委托也是一种类型,所以我们可以进行操作的运算符主要有 = (赋值操作)、 += (把一个方法绑定到一个委托变量上)、 -=(取消绑定)。 要注意的是:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。所以上面的程序中,我们给委托d绑定了3个有返回值的方法,但最终返回的是MulValue的返回值;我们给委托greeting绑定了2个方法,最终我们看到了这两个方法的执行结果。

  关于委托的+=和-=的工作原理,请查看http://www.jb51.net/article/59449.htm

  委托的缺点:在上面的程序中,我们可以随意地给委托进行赋值,破坏了程序的封装性,所以接下来该事件出场了。

  接下来请看:委托与事件——事件。

时间: 2024-10-23 16:58:08

委托与事件——委托的相关文章

javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会一层一层地上升,直到最顶层.而你不管在水的哪一层观察都可以看到并捕捉到这个气泡.好了,把“水”改成“DOM”,把“气泡”改成“事件”.这就是“事件冒泡” 什么是事件委托呢?event delegation : 地址:http://davidwalsh.name/event-delegate One

[JS]笔记14之事件委托

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

js事件冒泡和事件委托

js所谓的事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行 html: 1 <ul class="clearfix" data-type="cityPick"> 2 <li class="active_sort_opts" data-id="0">全部</li> 3 <li data-id="88">纽约</li> 4 <

委托与事件——事件

上接”委托与事件——委托“,为了维护程序的封装性,事件不得不出场. 关键字event,用来声明事件对象,允许一个类或对象提供通知的成员,他必须是委托类型. 事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,事件的类型是委托类型.调用我们所准备好的处理方法,要响应某些事件并针对某些事件执行我们指定的方法,需要做到以下几步: 1.声明事件委托. 2.声明事件.—————————怎么声明事件 3.添加事件的触发方法.——————这个事件在什么情况下会被触发 4.添加事件的处理程序(响应事

深入理解-事件委托

深入理解-事件委托 2016-11-20 15:02javascript.web开发综合.性能优化JS性能优化.事件冒泡.事件委托.事件委托优化.事件委托导致性能损失 65 views 很多人是在使用事件委托的,那对于一个使用者来说,只要能正确的使用好事件委托,完成工作,就算可以了,那么你有认真的考虑过事件委托的原理,以及你的使用场景是否适合使用事件委托呢,如果需要使用事件委托,那么你是否有正确的使用呢?这里我想简单的说一下我对事件委托的理解,希望可以有机会多多交流. 概述 事件委托有哪些好处,

事件捕获 事件冒泡和事件委托

这两天做项目遇到一个bug,寻思良久也找不到解决方案:各种看技术文档才发现是平时忽略的事件捕获,事件委托和事件冒泡的概念出现的问题.遂上网了解了一下相关的内容.以下是我的学习总结. 事件捕获:发生事件时首先在document上,然后依次传递到body,最后到目标节点上: 事件冒泡:指事件到达指点节点后不会结束,会向上一节点冒泡,直到document对象,跟事件捕获相反; 网景公司采用事件捕获方式:即父元素先触发,子元素后触发: IE则是采用事件冒泡方式:子元素先触发然后在触发父元素: W3C则是

四、集合与泛型、委托与事件-----《大话设计模式》

一.集合与泛型   数组 集合(ArrayList) 泛型 优点 连续存储.快速从头到尾遍历和修改元素 使用大小可按需动态增加 类型安全:省去拆箱和装箱操作 缺点 创建时必须制定数组变量的大小: 两个元素之间添加元素比较困难 类型不安全,接受所有类型的数据: 导致一直进行拆箱和装箱操作,带来很大的性能消耗   public partial class Form1 : Form { IList arrayAnimal_list = new ArrayList(); //声明并初始化集合 IList

javascript 事件委托(代理)

事件委托(代理):就是利用事件冒泡机制,在最顶层触发事件的dom对象上绑定一个处理函数.在当有需要很多dom对象要绑定事件的情况下,可以使用事件委托. 事件委托的好处是:节省资源 和 新增的元素也会有事件处理机制(这是项目中比较常见的问题) 简要的用两个例子来解释一下事件委托这回事... 先说说要产生的效果:我的想法是利用按钮点击新增li标签,而且新增的li标签也要有点击事件... HTML 代码 <ul id="ul1"> <li>1111</li>

JavaScript的事件委托技术

如果一个整体页面里有大量的按钮.我们就要为每一个按钮绑定事件处理程序.这样就会影响性能了.DOM访问次数增多,就会导致延迟加载页面.事实上,从如何来利用好事件处理程序,还是有很好的解决方案的. 一.事件委托 对事件处理程序过多的问题解决的方案就是事件委托技术. 事件委托技术利用了事件冒泡.只需指定一个事件处理程序. 我们可以为某个需要触发事件的父元素来绑定事件处理程序. HTML代码: <ul id = "ul1"> <li id = "li1"&