• 委托的概念


    有时我们需要将一个函数作为另一个函数的参数,这时就要用到委托Delegate机制。委托是一个较难讲清楚的概念,笔者苦思数日,终于想出了一个巧妙的例子。

           下面我们设计一个马戏表演函数RunCircus(),它的第一个参数是代表动物的函数,传给它什么样的动物,就进行什么动物的表演。请新建一个名为“Delegate”的项目,然后添加如下代码。

    试一试:定义委托

            //《C#初学课堂》     
            //
    函数:狗表演

            static void DogAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                        .----.

                     _.'__    `.

                 .--(#)(##)---/#"

               .' @          /###"

               :         ,   #####

                `-..__.-' _.-"###/

                      `;_:    `''

                    .'''''''`.

                   /,Snoopy ,"

                  // COOL! ""

                  `-._______.-'

                 ___`. | .'___

                 (______|______)");

     

            }

     

            //函数猫表演

            static void CatAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                  .-. __ _ .-.

                   | ` / " |

                   /     '.()--"

                  |         '._/

                 _| O   _   O |_

                 ="    '-'    /=

                   '-._____.-'

                   /`/"___/"`"

                  /"/o     o"/"

                 (_|         |_)

                   |____,____|

                   (____|____)");

     

            }

     

            //函数:狮子表演

            static void LionAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                          ,%%%%%%%%,

                         ,%%/"%%%%/"%%

                        ,%%%"c "" J/%%%

              %.       %%%%/ o o "%%%

              `%%.     %%%%    _ |%%%

                `%%     `%%%%(__Y__)%%'

                //       ;%%%%`"-/%%%'

               ((       / `%%%%%%%'

                ""    .'          |

                 "" /       " | |

                  ""/         ) | |

                   "         /_ | |__

                   (___________)))))))");

     

            }

     

           //定义委托

            delegate void AnimalAct(string name);

     

            //函数:马戏表演(第一个参数为AnimalAct型委托)

            static void RunCircus(AnimalAct animalAct, string name)

            {

                animalAct(name);

            }

     

            static void Main(string[] args)

            {

               //把函数DogAct()转换为AnimalAct型委托

                AnimalAct deleDogAct = new AnimalAct(DogAct);

                //把委托deleDogAct传给函数RunCircus()

                RunCircus(deleDogAct, "Snoopy");

     

                //把函数CatAct()转换为AnimalAct型委托,并传给函数RunCircus()

                RunCircus(new AnimalAct(CatAct), " Kitty ");

     

            }

               

                运行结果如下:

    7.JPG
         《C#初学课堂》

    函数RunCircus(AnimalAct animalAct, string name)的第一个参数实际上是一个代表动物的函数,传给它什么样的函数,它就用什么样的动物进行表演。但为了进行严格的类型检查,我们不能直接把函数的名称传递给它,而应先定义一个委托(Dlelegate),即定义一种“函数类型”。

    8.JPG

           委托用关键字delegate声明,上面的语句定义了一种名为AnimalAct的委托(函数类型),明确规定了委托的参数类型和返回值类型。当我们需要把某个函数作为参数时,就要先把它转换为委托实例。

    9.JPG


       然后把这个委托实例以参数的形式传递给调用它的函数。


    13.JPG

    由此可以看出委托实例deleDogAct实际上是函数DogAct()的别名,显然委托和被委托函数应具有相同的参数类型和返回类型。

    在我们的程序中,马戏团总是调用函数RunCircus()进行表演。定义函数RunCircus()时,我们不知道也不关心传递给它的委托代表哪个函数,直到调用RunCircus()函数,并把实际参数传递给它时,这个函数才具体化。传给它什么样的实际参数,就进行什么样的表演,传给它deleDogAct委托,马戏团就进行狗的表演;传给它deleCatAct委托,马戏团就进行猫的表演;传给它deleLionAct委托,马戏团就进行狮子表演。因此以委托为参数的函数具有一定的通用性

  • 相关阅读:
    .Net几大优点
    小谈.NET下的缓存。
    ASP.NET 防盗链的实现[HttpHandler]
    给网页加个个性的图标
    四个字节整型转换为IP格式
    在 ASP.NET MVC 中使用带后缀的 URL
    Visual Studio 2008 安装 SP1 后智能提示变英语的修补程序 (KB957507)
    Visual Studio 2008 SP1 安装失败的解决方法
    关于0x0d和0x0a回车换行\r和\n
    图像处理工程师的要求
  • 原文地址:https://www.cnblogs.com/dajiang02/p/1372390.html
Copyright © 2020-2023  润新知