zoukankan      html  css  js  c++  java
  • 委托

            委托就是为了传递方法的类型,我们定义过方法,在定义方法时还可以指定传入参数,传入参数是什么,就会用什么值去运行方法中的代码。仔细想一想会不会有另外一种需求呢?就是在方法中,我都不知道怎么处理,这段逻辑也是靠外部传过来,你传什么我就执行什么,其本质就是 把一段逻辑代码,看成是参数一样,可以传递。说通俗点 就是装 方法的一个容器,把方法当参数 传来传去。这就是委托的意义。

           委托本质是类,定义委托时,需要指定方法签名(就是参数和返回值)。下面就是一些委托的定义,有无参无返回值的,有参数无返回值的,无参数有返回值的。

         

                 //1.声明 委托类( 必须指定 返回值类型 和 方法参数列表)
                public delegate void DGSayHi(string str);
    
                //我们刚刚说了,委托是一个类,所以需要实例化,然后就可以传入签名相同的方法并调用
    
              //2.创建委托对象 , 并 为委托对象 添加一个 方法指针(方法对象地址)  因为DGSayHi是一个传入string参数无返回值,所以就只能传入相同的方法
                DGSayHi dgSayHi = new DGSayHi(SayHiInSomeWhere);
    
                void SayHiInSomeWhere(string location)
         {
          MessageBox.Show(location + "您好~~!:)");
        }
    
         //3.调用委托!(委托对象内部的 方法 就会被调用)
         dgSayHi("哇哈哈哈!");  //等价于 dgSayHi.Invoke("哇哈哈哈!")

    这就是 完整的 委托的使用,接下来看一下方法被当做参数传递   SayHiPerfect方法没有逻辑,就是靠参数method传入逻辑。这个时候就需要委托来讲方法包一下,传进去

                

                

    泛型委托  

    如果你知道泛型,那么就很容易理解泛型委托,说白了就是含有泛型参数的委托,例如:

     public delegate T GenericDelegate<T>(T cs);  //定义一个泛型委托

                  GenericDelegate<int> doe = new GenericDelegate<int>((a) => { return a + 1; });
                GenericDelegate<string> does = new GenericDelegate<string>((a) => { return a + 1; });
               Console.WriteLine( doe.Invoke(10));  //11
                Console.WriteLine(does.Invoke("10")); //101

         根据传入的泛型参数不同,就会产生不同的委托类型  传入一个签名相同的方法时,这里使用了lambda表达式。

    系统自带 泛型委托 action func

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action。

    Action act1 = new Action(this.DoNothing);  //Action 满足0到16个泛型参数  没有返回值的委托
    
    //Action<int> act2=new Action<int>();  //一个int类型参数 无返回值
    
    Func<int> fun1 = new Func<int>(this.GetNothing);  //Func 满足0到16个泛型参数  带返回值的委托  最后一个为返回值类型
    
    // Func<int,string> func2=new Func<int, string>() //int类型参数  返回string 类型

    多播委托

    所有的委托实例都有多播的功能。所谓多播,就像一群程序员在瞬聘网填好了求职意向后,某天有个公司发布了一个和这些程序员求职意向刚好相匹配的工作,然后这些求职者都被通知了 - “有一份好工作招人啦,你们可以直接申请去上班了!”。 我们可以向委托实例中加入很多方法,然后执行这个委托就把里面所有的方法都执行了。

    也就是说,一个委托实例不仅可以指向一个方法,还可以指向多个方法。例如:

    MyDelegate d = MyMethod1;// “+=” 用来添加,同理“-=”用来移除。
    d += MyMethod2;// d -= MyMethod2 

    调用时,按照方法被添加的顺序依次执行。,如:

    d(); 会调用  MyMethod1 和 MyMethod2 两个方法

    委托的异步调用

    委托.beginInvoke() 这样就会开启一个线程 去跑委托中的方法,这样的委托 异步调用  线程是线程池中的线程。

    要有多努力才能对得起奔波的脚步和身上的期望
  • 相关阅读:
    Kafka简单使用
    mvn 打包和启动jar包
    一次去大华Java面试题
    springboot注解与xml配置对应关系
    javascript语法参考
    一个好用的在线java反编译工具
    centos7安装docker1.31
    象棋博客
    eclipse自动补全快捷键设置
    sql server 锁机制
  • 原文地址:https://www.cnblogs.com/hxfcodelife/p/10478221.html
Copyright © 2011-2022 走看看