zoukankan      html  css  js  c++  java
  • 委托

    1、委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值
    2、委托的条件:与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。
    3、简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法
    4、可以这么理解:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

     委托揭秘:

    //A 定义一个委托:
    public delegate void Feedback(string message);
    //B 实例化委托
    Feedback tdm1 = new Feedback(showMes); //showMes是方法
    //C 直接调用委托
    tdm1("hello,这是委托调用方式一");
     
    1 在A中事实上编译器会定义一个完整的类: Feedback
    如上图:所有委托都有一个构造器默认获取两个参数,一个是对象引用@object,一个是引用了回调方法的整数method;在构造器内部这两个参数被保存在_target和_methodPtr私有字段中,这两个字段来自委托的父类MulticastDelegate,另外构造器还将_invocationList设置为null,在此后委托链会使用它。
    Invoke,编译器实在定义委托类的时候定义Invoke的,在Invoke被调用时(默认使用委托时,其实是调用了该委托的Invoke方法),它使用私有字段_target和_methodPtr在指定对象上调用包装好的回调方法,Invoke方法的签名和委托的签名匹配

    委托基类介绍

    新定义的委托继承自MulticastDelegate类,MulticastDelegate继承自sysrem.Delegate类,sysrem.Delegate类又继承自Object类,所以你定义的委托都包含MulticastDelegate的行为;由于委托是类,所以凡是能够定义类的地方都可以定义委托;

    委托链

    前面使用的每个委托都只包含一个方法调用。调用一个委托就调用一个方法调用。如果要通过一个委托调用多个方法,那就需要使用委托的多播特性。委托链。如果调用多播委托,就可以按委托添加次序连续调用多个方法。为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果;
    语法糖的操作符:+= 将方法绑定到委托 -= 解绑
    /// <summary>
    /// 定义包含一个参数的委托
    /// </summary>
    /// <param name="name"></param>
    public delegate void GreetingDelegate(string name);
    public GreetingDelegate delegate1; //委托的实例,变量
    //绑定方法
    delegate1 += Chinese;
    delegate1 += English;
    此处delegate1是当前类的一个变量,在oop中我们在外部对字段进行赋值显然破坏了类的封闭性,在非委托类型中我们一般使用 属性解决这种问题,但是委托是没有属性生命语法的,委托的属性表现形式就是事件 event
     

    委托事件(事件)的声明

    //声明委托
    public delegate void GreetingDelegate(tring name));
    public event GreetingDelegate Delegate1Event; //声明委托事件 (委托的属性表现形式)
    //绑定方法
    Delegate1Event+= Chinese;
    Delegate1Event+= English;
     
    事实上webform中我们看到的事件不是长这样的,例如click事件有两个参数,那是因为上面定义的事件不符合.Net Framework的编码规范。但是这不是必须的事件规范;
    符合 .Net Framework的编码规范的委托事件:
    1)委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型(委托方法所属的对象),一个 EventArgs类型(或继承自EventArgs)
    2)委托类型的名称都应该以EventHandler结束, 事件的命名为 委托去掉 EventHandler之后剩余的部分。 委托参数的定义:继承自EventArgs的类型应该以EventArgs结尾。
     
     
    绑定方法:
     
     
    参考:http://baike.baidu.com/link?url=sMxb7674tpe-31u4QC79apk9eGrO31Kq26GddetLFYeSG9jM35cXAjB0k8KNM9fXLx6q_OkHpygeSOA_KuPLOWr6-h48-nin1ehwaqV_v43
     
     
     
  • 相关阅读:
    HDOJ 1093
    HDOJ 1089
    HDOJ 1094
    qsort函数
    HDOJ 1092
    HDOJ 1091
    NYOJ 448(贪心)
    HDOJ 1090
    HDOJ 1097(幂取模)
    winform用户输入查询与拼音首字母的结合,提高用户的操作体验
  • 原文地址:https://www.cnblogs.com/shaner/p/6296044.html
Copyright © 2011-2022 走看看