zoukankan      html  css  js  c++  java
  • 委托

    一.委托的概念

           委托是一种在对象里保存方法的引用,也是一种类型安全的函指针。

       继承是System.MulicastDelegate,任何委托都是多播委托。在IL层中,委托就是一个类。IL(中间语言,高级语言(如C#等)-----中间语言(IL)---计算机识别语言)

    二委托语法

          声明委托

               public  delegate void  MethodDelegate;

         实例委托

              MethodDelegate method=new MethodDelegate(domethod);//此处把方法作为参数传入实例,注意不要加()

          委托实例的调用

              不带参数:

               method.Invoke();//效果等同于 domethod();  此处也可以省略Invoke直接method()个人习惯。

              带参数

              method.Invoke(string s1,string s2......);//此处必须和声明委托时所要求的参数个数、类型、顺序完全保持一致。

              委托调用的几种方式

              method.Invoke();

             method.BeginInvoke();//用一个异步多线程完成计算

             method();

       为了保证规范性,微软提供了两种委托来满足所有的委托需求,Action和Func

             Action

               提供一个不带返回值的委托方法,可以接收0-16个泛型参数

              语法:Action<string,string.....>  

              示例: 

             Action<string,string.....> action=new Action<string,string.....>(method);//注意这里的method方法的参数列表的个数、顺序、类型必须和委托是一致的

             action.Invoke("参数的值1","参数的值2");

           Func

           提供一个带返回值的委托方法,可以接收0-16个泛型参数

           语法Func<string,string>//这里需要注意,<>里最后一个类型表示返回值类型

           示例

           Func<string.......string>func=new Func<string.....string>(method);

          string Result=func.Invoke();//这里可以像普通调用方法一样得到返回值

    三。多播委托

       所有的委托都继承自System.MulicatDelegate,而MulicatDelegate就是多播委托。

         多播委托存在的意义:

            一个委托实例包含多个方法,可以通过+=/-=添加/移除方法,Invoke时可以按顺序执行。+=按照从上至下的顺序,-=按照至下向上的顺序执行

           语法:

              Actiong<string>action=method;

              action+=method1;

              action+=method2;

              ..........................

               action.Invoke();//

           说明:通常情况我们不会使用Func来进行多播委托,原因:当有多个方法都具备返回值时,不能获取中间的返回值,只能获取最后一个方法的返回值。

      多播委托在执行时出现未捕获的异常,方法链会直接结束。

    多播委托不能直接使用BeginInvoke()方法来调用,因为多播委托不支持异步多线程。而如果在实际的应用场景中又有这样的需求,那么我们可以换一种思路。

    可以通过遍历GetInvocationList()来循环使用BeginInvoke();

    如有不足之处,希望大家帮忙指出,万分感谢。

                 

  • 相关阅读:
    跨域名登录态传递
    ECC公钥格式详解
    企业应用架构演化探讨:从微服务到Service Mesh
    阿里云宕机故障
    一个“三无管理者”的思考
    如何构建安全的微服务应用
    微服务架构实践
    Redis持久化之RDB
    Redis持久化persistence
    Redis 缓存失效和回收机制续
  • 原文地址:https://www.cnblogs.com/JohnTang/p/10902237.html
Copyright © 2011-2022 走看看