zoukankan      html  css  js  c++  java
  • 委托[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 );

     

     

     

        }

     

    }

     

  • 相关阅读:
    CF598E Chocolate Bar 题解 动态规划
    CF864E Fire 题解 背包DP
    用 程序 解决 windows防火墙 的 弹窗 问题
    windbg 使用与技巧
    bat 下 字符串拆分 类似 split 可以使用 for /f delims
    vs2013 在按F5调试时,总是提示 “项目已经过期”的解决方案
    代理与反向代理
    关于维护用户状态的一致性
    视频的裁剪后缩放功能。
    通信协议的设计
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191897.html
Copyright © 2011-2022 走看看