• 13委托和事件


    1、委托是什么?

    委托是一种数据类型,像类一样可以声明委托类型变量)。方法参数可以是 int、string、类类型

    void M1(int n){ }        

    void M2(string s){ }    

    void M3(Person p){ }    

    那么能不能把方法也作为参数进行传递?

    委托就是一种数据类型,用来存放方法的了数据类型


    委托的声明方式:delegate 返回值类型 委托的名(参数)

    存储什么样的方法就声明什么类型(方法参数与返回值)的委托。

    声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型的方式:        Mydel f1;

     

     

    将委托类型变量指向函数 Mydel sp = new Mydel (SayHello) ,这样就可以像调用普通函数一样把 sp 当函数用了。委托可以看作是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向他,函数也可以用委托变量指向它。

    和直接调用函数的区别:用委托就可以指向任意函数,哪怕是之前没定义的都可以,而不适用受限于那几种。

    将委托类型变量指向函数还可以简化成  Mydel sp = SayHello ,编译器帮我们进行了  new  。但是不能 sp = PrintIt() ,因为这样就成了函数调用;

    2、匿名方法

    1、使用 Delegate 的时候很多时候没必要使用一个普通的方法,因为这个方法只有 Delegate 会用,并且只用一次,这是使用匿名方法最合适

    2、匿名方法就死没有名字的方法。(整数 3 就是没有名字的 int 对象。3+5 就是两个匿名 int 对象的相加,允许匿名对象,就允许匿名方法)

     

    ProcessWordDelegate p = delegate(string s) { Console.WriteLine( string s ); };

    匿名方法与 lambda 表达式最终编译为一个方法

     

    3、多播委托
    1. 委托绑定多个方法后,其中一个方法执行发生异常,后面的方法不会继续执行
    2. 组合的委托必须是同一个类型
    3. 相当于创建了一个按照组合顺序一次调用的新委托对象
    4. 委托的组合一般是给事件用的,用普通的委托的时候很少用

     

    4、事件(通过委托实现的,委托才是事件正常执行的核心内容)

    事件语法:        event ProcessWordDelegate

    加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。

    5、委托和事件的区别

    委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为第委托变量的封装。)

    下面说的是委托的对象(用委托方式实现的事件) 和 (标准的 event 方式实现) 事件的区别。

    事件的内部是用委托实现的。

    对于事件来说,外部只能  “注册自己 +=   、  注销自己 -=“ ,外界不可以注销其它的注册者,外界不可以主动触发事件,因为如果用Delegate就没法进行上面的控制,因此但是了事件这种语法。  add、remove

    事件是用来阉割委托实例的。事件只能 add 、 remove 自己,不能赋值。

    事件只能 += 、-= ,不能 = 、不能外部触发事件

    6、委托与事件总结

    委托的作用:

    占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为 null。

    事件的作用:

    事件的作用与委托一样,只是功能上比委托变量有更多的限制

    比如:

        1、只能通过 += 或 -= 来绑定方法(事件处理程序)

        2、只能在类内部调用(触发)事件

    在自定义控件(自己编写控件的时候,会大量用到。编写控件的时候,会写一些事件。但是当这些事件被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),个体调用的是哪个方法,由使用控件的人来决定(Click+=new  委托(方法名);))





  • 相关阅读:
    Net Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程
    Xamarin开发手机聊天程序
    线上处理数据转载
    Logstash
    Webpack按需加载一切皆模块
    网络编程
    NET Core 事件总线
    Using INSERT IGNORE with MySQL to prevent duplicate key errors
    Spring的两种任务调度Scheduled和Async
    Embedded servlet containers
  • 原文地址:https://www.cnblogs.com/pirates/p/4588585.html
Copyright © 2020-2023  润新知