zoukankan      html  css  js  c++  java
  • 关于事件、委托、被调用方法的详解

    先上图:

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

    然而,当执行到

    radioButton[0].Checked = true;

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

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

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

    关键点如下:

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

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

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

    以上~

  • 相关阅读:
    【HDOJ5538】House Building(计算几何)
    maven操作
    Guava 是个风火轮之函数式编程(3)——表处理
    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
    Google Guava官方教程(中文版)
    Guava中Predicate的常见用法
    guava函数式编程
    idea常用快捷键
    guava
  • 原文地址:https://www.cnblogs.com/snys98/p/4280052.html
Copyright © 2011-2022 走看看