• 委托与事件的使用


    一、

    委托的声明

     delegate void MyDelegate(参数) //不返回值 。返回值则更改void为返回值类型 

     编译后MyDelegate继承自System.MulticastDelegate类,会自动添加如下三个方法,用于同步或者异步执行委托

     public class MyDelegate:MulticastDelegate

          {
              //同步调用委托方法
              public virtual void Invoke();
              //异步调用委托方法
              public virtual IAsyncResult BeginInvoke(***,AsyncCallback callback,object state);//自动生成的,必须协变AsyncResult的用途有这么几个:传递参数,它包含了对调用了BeginInvoke()的委托的引用;它还包含了BeginInvoke()的最后一个Object(state)类型的参数;它可以鉴别出是哪个方法的哪一次调用,因为通过同一个委托变量可以对同一个方法调用多次。*代表委托定义的参数是一致的,callback是回掉的委托类型,定义格式为AsyncCallback(IAsyncResult rt),state--Object类型用于传递任何你想要的数值,它可以通过IAsyncResult.AsyncState属性获得
              public virtual void EndInvoke(IAsyncResult result);//EndInvoke()方法接受IAsyncResult类型的对象,根据委托是否有返回值而返回值
          }

    不过执行委托直接Mydelegate(参数)即可,如果要返回委托链中的每个值可以用mydelegate的 GetInvocationList()方法获得委托链,然后分别使用invoke或者delegate基类中的DynamicInvoke()执行委托,返回值。

     

     

     Action 和 Func  Predicate

     都是声明委托用的,第一个是生命没返回值的委托,第二个则是有返回值,第三个只返回bool值,例如

     Func<int,int> ADelegate = (m=>m+1);

    int result=ADelegate(1);//第一个是参数类型,第二个是返回值类型

    使用委托注意事项

     1、委托属于引用类型,必须new。例如:

     MyDelegate myDelegate=new MyDelegate(Method);

     2、第一次加入委托链使用“=”,后续则“+=”

     3、Method参数必须与定义的委托MyDelegate一致

     4、委托可以作为方法的参数 

    5、语法规范,委托要以Delegate结尾命名 

     泛型委托的定义

     delegate void Handler<T>(T obj);

    Predicate<String> p  //它始终只返回bool值。一般用于集合类 判断返回对象

    public static bool Contains<T>(this IEnumerable<T> collection, Predicate<T> condition)
    {
    return collection.Any(x => condition(x));
    }

      

    二、

    事件的声明 

    //声明委托,第一个参数是触发对象,第二个则是需要传递的信息的类型对象
    public delegate void MyEventHandler(Object sender, MyEventArgs e);
    public event MyEventHandler MyEvent{add{MyEventHandler+=value};remove{MyEventHandler-=value}}; //声明事件 执行:MyEvent(this,e),e如果自定义,必须继承自EventArges .后边的add和remove是事件访问器

     事件其实就是声明了一个委托类型的封装的变量而已

    使用事件的注意事项

     1\编码规范:委托类型的名称都应该以EventHandler结束。

    委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
    事件的命名为 委托去掉 EventHandler之后剩余的部分。
    继承自EventArgs的类型应该以EventArgs结尾。

     2\直接可以使用+=和-=加入和删除委托链

    3、事件由事件发布者执行 ,因为事件总是私有的

    劳神费力的,点歌赞打赏打赏
  • 相关阅读:
    WEB环境搭建(tomcat)、Eclipse连接tomcat
    spring—springmvc整合
    声明式事务
    mybatis—当表的字段名和实体类的列名不对应时的三种处理方式
    Spring整合MyBatis
    mybatis关系映射(1对1,1对多,多对多)
    mybatis
    编程式事务
    使用maven在netbeans下构建wicket项目
    mysql问题Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)的解决方法
  • 原文地址:https://www.cnblogs.com/zfcflower/p/2789029.html
Copyright © 2020-2023  润新知