委托

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

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

     

             //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() 这样就会开启一个线程 去跑委托中的方法,这样的委托 异步调用  线程是线程池中的线程。

 

posted @ 2019-03-05 22:44  我才是酷酷的飞  阅读(268)  评论(0编辑  收藏  举报