• 委托,深入浅出才是王道(一)


          委托和事件在 .NET Framework 中的应用非常广泛,较好的理解委托和事件对很多人来说可能并不容易。它们像一道坎儿,过了这个坎儿的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里模糊,浑身不自在。下面就通过简洁的语言和通俗的例子来讲一下什么是委托、如何实现委托,如何实现委托,以及事件的使用与处理。

    View Code
     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         PepoleClass pc=new PepoleClass();
     6         pc.SpeakOperate(@"张三",PepoleClass.Language.ch);
     7         pc.SpeakOperate(@"张三",PepoleClass.Language.en);
     8         Console.ReadLine();
     9     }
    10 }
    11 public class PepoleClass
    12 {
    13     public void SpeakChinese(string name)
    14     {
    15         Console.WriteLine("你好,{0}", name);
    16     }
    17 
    18     public void SpeakEnglish(string name)
    19     {
    20         Console.WriteLine("Hello,{0}", name);
    21     }
    22 
    23     public enum Language
    24     {
    25         en, ch
    26     }
    27 
    28     public void SpeakOperate(string name, Language lang)
    29     {
    30         switch (lang)
    31         {
    32             case Language.ch:
    33                 SpeakChinese(name);
    34                 break;
    35             case Language.en:
    36                 SpeakEnglish(name);
    37                 break;
    38         }
    39     }
    40 }

    以上代码定义一个pepole类,实现讲中文和英语的方法,通过枚举类型控制说那种语言,这样是很好。但是细想一下,这个方法的扩展性还是太差了,如果以后我们需要再添加法语、德语,就不得不反复修改枚举和SpeakOperate()方法以适应新的需求。

    那么,有没有更好的解决方案呢?

    可能你已经想到了,我们可以使用委托。

    引入委托

    我们先来看看SpeakOperate()方法的声明:

    public void SpeakOperate(string name, Language lang)

    可以看到,我们需要传入两个参数,然后根据枚举类型判断用哪个方法进行处理。我们假设SpeakOperate()方法可以接收一个参数变量,这个参数变量可以代表一个方法,我们只需要传入方法名然后执行相应方法,对了,这就是委托!

          在C#中,定义委托的语法是:

    delegate void SpeakDelegate(string name);

    delegate关键字用于声明一个引用类型,该类型可用于封装命名方法和匿名方法。

    下面用委托来改造一下这个demo,只需定义一个委托,然后更改SpeakOperate()方法即可:

    public delegate void SpeakDelegate(string name);
    public void SpeakOperate(string name, SpeakDelegate speak_method)
    {
        speak_method(name);
    }

    Main函数中的调用如下:

    static void Main(string[] args)
    {
        PepoleClass pc = new PepoleClass();
        pc.SpeakOperate(@"张三", pc.SpeakChinese);
        pc.SpeakOperate(@"张三", pc.SpeakEnglish);
        Console.ReadLine();
    }

    总结:

    委托是一种特殊的对象类型,它定义了方法的类型,是的可以将方法当作另一个方法的参数来进行传递,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是方法的地址。这种方法动态地赋值给参数的做法,可以避免在程序中大量使用if…else、switch语句,同时使得程序既有更好的扩展性。

    多播委托,请听下回分解

  • 相关阅读:
    LUOGU P3355 骑士共存问题(二分图最大独立集)
    LUOGU P1453 城市环路(基环树+dp)
    BZOJ 1441 Min (裴蜀定理)
    LUOGU P1342 请柬(最短路)
    LUOGU P1186 玛丽卡
    LUOGU P2580 于是他错误的点名开始了(trie树)
    l洛谷 NOIP提高组模拟赛 Day2
    bzoj 4372 烁烁的游戏——动态点分治+树状数组
    bzoj 3730 震波——动态点分治+树状数组
    hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
  • 原文地址:https://www.cnblogs.com/error500/p/2684321.html
Copyright © 2020-2023  润新知