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

关于事件、委托、被调用方法的详解

时间:2015-02-08 15:29:13      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

先上图:技术分享

大概就是这样,有5个radiobutton和5个fragment,要做的是选中按钮和页面的对应Show()。

然而,当执行到

radioButton[0].Checked = true;

之后,事件CheckedChange被触发,i的值会显示为5,提示数组越界。

Why?这里就要涉及到关于事件→委托→被调用方法的关系问题:(以下均为个人理解)

!即是:事件封装委托,委托指向方法

关键点如下:

1、这里使用的是lambda表达式调用匿名方法,原理上也是一种委托,只是匿名方法原封不动地引用了所有来自原有方法的变量(结果就是变量i的生命周期被延长)。

2、事件封装了委托,委托说明事件触发的时候应该去调用位于委托指向的方法(委托我理解为函数指针),所以这里+=的意思是:事件触发时执行指定代码,而不是为事件挂载指定代码,理解起来就是“匿名方法虽然写在父级方法体里面,但其不属于父级方法”,i的值在匿名方法执行的时候被确定,而不是在“挂接”的时候被确定。

3、我们应该都知道:委托可以用=也可以用+=来挂接方法,用-=来取消方法的挂接;但是事件只能用+=和-=,可以挂接方法,也可以挂接委托。我们可以把委托想象成一个链表:委托每次=改变链表首地址,每次+=都新增一个节点,-=就移出对应的结点。而事件则是对委托的面向对象的封装:我们不能用=来直接操作不安全的函数指针指向,而只能用+=和-=来操作链表对象。总结起来,我的观点就是“委托类似单向链表,事件是委托的安全封装”。委托要是=错了地址,整个链表全崩;事件则不会给你操作地址的机会。

 

以上~

关于事件、委托、被调用方法的详解

标签:

原文地址:http://www.cnblogs.com/snys98/p/4280052.html

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