• 委托[delegate]_C#


    委托(delegate):

    委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。

    下面看一段代码:

    using System ;

    delegate void EatDelegate(string food);

    class MyDelegate

    {

           static void zsEat(string food)

           {

                  Console .WriteLine ("张三吃"+food);

           }

           static void lsEat(string food)

           {

                  Console .WriteLine ("李四吃"+food);

           }

           static void wwEat(string food)

           {

                  Console .WriteLine ("王五吃"+food);

           }

           static void Main()

           {

                  EatDelegate zs=new EatDelegate (zsEat );         //C#2.0语法:   

    EatDelegate zs=zsEat ;

     

                  EatDelegate ls=new EatDelegate (lsEat );          

     

                  EatDelegate ww=new EatDelegate (wwEat );

     

                  EatDelegate eatChain=null;

     

                  Console .WriteLine ("座谈会开始");

     

                  eatChain = zs+ls+ww;

     

                  eatChain ("西瓜");

     

                  Console .WriteLine ("李四出去接电话");

     

                  eatChain -=ls;

     

                  eatChain ("香蕉");

     

                  Console .WriteLine ("李四回来了");

     

                  eatChain +=ls;

     

                  eatChain ("桔子");

     

                  //下面是匿名方法¨

     

                  eatChain += delegate(string food) {Console .WriteLine ("我吃"+food);   };

     

                  eatChain += delegate(string food) {Console .WriteLine ("你吃"+food);   };

     

                  eatChain += delegate(string food) {Console .WriteLine ("他吃"+food);   };

     

                  eatChain ("饭");

     

           }

     

    }

     

    下面是实例方法的一段代码:

     

    using System ;

     

    delegate void EatDelegate(string food);

     

    class Man

     

    {

     

           private string name;

     

           public Man(string name)

     

           {

     

                  this .name =name ;

     

           }

     

           public void eat(string food)

     

           {

     

                  Console .WriteLine (name+"吃"+food);

     

           }

     

    }

     

    class Party

     

    {

     

           static void Main()

     

           {

     

                  Man ZS=new Man ("张三");

     

                  Man LS=new Man ("李四");

     

                  Man WW=new Man ("王五");

     

                 

     

                  EatDelegate zs=new EatDelegate (ZS.eat );

     

                  EatDelegate ls=new EatDelegate (LS.eat );

     

                  EatDelegate ww=new EatDelegate (WW.eat );

     

                  EatDelegate eatChain=null;

     

                  Console .WriteLine ("座谈会开始");

     

                  eatChain = zs+ls+ww;

     

                  eatChain ("西瓜");

     

                  Console .WriteLine ("李四出去接电话");

     

                  eatChain -=ls;

     

                  eatChain ("香蕉");

     

                  Console .WriteLine ("李四回来了");

     

                  eatChain +=ls;

     

                  eatChain ("桔子");

     

           }

     

    }

     

    委托可作为方法的参数进行动态调用,看下面代码:

     

    using System ;

     

    delegate void EatDelegate(string food);

     

    class Man

     

    {

     

        private string name;

     

        public Man(string name)

     

        {

     

           this .name =name ;

     

        }

     

        public void eat(string food)

     

        {

     

           Console .WriteLine (name+""+food);

     

        }

     

    }

     

    class Party

     

    {

     

        static void eatTogether(string food,params EatDelegate [] values)

     

        {

     

           if (values ==null )

     

           {

     

               Console .WriteLine ("座谈会结束");

     

           }

     

           else

     

           {

     

               EatDelegate eatChain=null ;

     

               foreach (EatDelegate ed in values )

     

                  eatChain +=ed;

     

               eatChain (food);

     

               Console .WriteLine ();

     

           }

     

        }

     

        static void Main()

     

        {

     

           Man ZS=new Man ("张三");

     

           Man LS=new Man ("李四");

     

           Man WW=new Man ("王五");

     

          

     

           EatDelegate zs=new EatDelegate (ZS.eat );

     

           EatDelegate ls=new EatDelegate (LS.eat );

     

           EatDelegate ww=new EatDelegate (WW.eat );

     

          

     

           Console .WriteLine ("座谈会开始");

     

           eatTogether("西瓜",zs,ls,ww);

     

           Console .WriteLine ("李四出去接电话");

     

            eatTogether("香蕉",zs,ww);

     

           Console .WriteLine ("李四回来了");

     

            eatTogether("桔子",zs,ls,ww);

     

            Console .WriteLine ("座谈会结束");

     

            eatTogether (null ,null );

     

     

     

        }

     

    }

     

  • 相关阅读:
    mysql生成随机时间
    使用JEECG心得
    嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
    svn 的使用(二)
    Java的几个有用小Util函数(日期处理和http)
    设置UITableViewCell高度的问题
    初探排序学习笔记
    从串口设置、读取、并分析um220模块的数据
    NYOJ-47 过河问题
    Lock_sga 和 pre_page_sga 参数详解
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191897.html
Copyright © 2020-2023  润新知