zoukankan      html  css  js  c++  java
  • 我的委托小总结

    总结一下最近自己学习的委托,可能理解有错误,请各位大佬指正。

    MSDN上给委托定义为:委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

    这三句话的意思表明了委托是一种类型,但是一种很特殊的类型,包含参数,返回值,一般类前面会有一个class修饰,但是委托前面用delegate;

    在实例化委托这个类型时需要与一个具体的方法相关联,而且这个方法的参数,返回值必须与委托定义的参数和返回值类型、个数一致

    根据一个故事来吧..鸿门宴! 一位将军设了一场鸿门宴,喝酒的时候,

    将军举左手,左边的部队杀出。将军举右手,右边的部队杀出。

    用代码实现就是

    一个将军的类:

    public class Boss
    {
        // 1:左手  2:右手
        public int Status { get; set; }
    }

    左边的部队:

    public class Left
    {
      public void Go()
      {
         Console.WriteLine("左部队,杀出!");
      }
    }

    右边的部队:

    public class Right
        {
            public void Go()
            {
                Console.WriteLine("右部队,杀出!");
            }
        }

    然后在鸿门宴上,将军要喝酒了。

        static void Main(string[] args)
            {
                Boss boss = new Boss()
                {
                    Status = 1
                };
    
                if (boss.Status == 1)//举左手
                {
                    new Left().Go();
                }
                else if (boss.Status == 2)//举右手
                {
                    new Right().Go();
                }
                else//摔杯
                {
                    new Left().Go();
                    new Right().Go();
                }
    
                Console.ReadKey();
            }

    是不是感觉代码很烂,而且扩展性不高,并且要是有好几场鸿门宴一起举行呢(虽然这是不可能的),要循环这一堆else if吗!

    用委托试试吧!

    将军设置的鸿门宴,将军发出委托,各部门接到委,等待将军举手部下执行委托.这个委托是有将军发出的所以:委托在将军这

      //委托
        public delegate void BossDelegate(int status);
        public class Boss
        {
            public BossDelegate action;
            // 1:左手  2:右手
            public int Status { get; set; }
        }

    然后左右两个部队收到将军的委托等待将军举手执行委托:

    左部队

      public class Left
        {
            Boss boss;
            public Left(Boss boss)
            {
                this.boss = boss;
                boss.action += Go;
            }
    public void Go(int status) { if (status == 1) { Console.WriteLine("左部队,杀出!"); } } }

    右部队

    public class Rigth
        {
            Boss boss;
            public Rigth(Boss boss)
            {
                this.boss = boss;
                boss.action += Go;
            }
    public void Go(int status) { if (status == 2) { Console.WriteLine("右部队,杀出!"); } } }

    鸿门宴开始了:将军把委托分配下去,将军要举起左手

        static void Main(string[] args)
            {
                Boss boss = new Boss()
                {
                    Status = 1
                };
                Left left = new Left(boss);
                Rigth right = new Rigth(boss);
    
                boss.action(boss.Status);//执行委托
    
                Console.ReadKey();
            }

    左部队,右部队接收到将军的委托,伺机而动,等待将军举杯执行委托

    如果多场鸿门宴呢? 看一下

        static void Main(string[] args)
            {
                List<Boss> bosss = new List<Boss>()
                {
                    new Boss () { Status = 1 },
                    new Boss () { Status = 2 },
                    new Boss () { Status = 1 }
                };
                Boss boss = new Boss();
                Left left = new Left(boss);
                Rigth right = new Rigth(boss);
    
                foreach (var model in bosss)
                {
                    boss.action(model.Status);
                }
                Console.ReadKey();
            }

    哎呦! 不错哦! 如果将军再加一个状态叫 摔杯 呢? 那是不是只需要修改左右部队的代码就可以了,而不用动其余代码了。

    虽然增加了代码安全性,代码扩展性,代码的美观。但是还是有点太麻烦。

    于是委托它就 进化了。。。匿名方法产生了

    当我知道匿名方法的时候,大吃一惊,wc,这个直接调用一个方法有啥区别吗?

    其实在使用时,这和普通方法没有区别,但是匿名方法可以在一定程度上减少系统开销

    匿名方法是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法。

    匿名方法最明显的好处就是可以降低另写一个方法的工作量;另外一个好处就是可以访问调用者的变量,降低传参数的复杂度。
            Boss boss = new Boss();
    boss.action
    += delegate(int status) { if (status == 1) { Console.WriteLine("左部队,杀出!"); } }; boss.action += delegate (int status) { if (status == 2) { Console.WriteLine("右部队,杀出!"); } };

    C#引入匿名方法后,我们就不需要在单独写这些方法了,我们只需在匿名方法体内实现我们的业务逻辑即可!

    通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

    但是呢~微软那帮人觉得上面那样搞代码还不够简洁,如是又产生了lambda表达式

    于是他就二次进化了。。。

    Lambda产生了 

    Lambda 表达式是一个匿名函数

    Lambda简化了匿名委托的使用,减少开发中需要编写的代码量。

    Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。

    Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”。

           Boss boss = new Boss();
    
                boss.action += x => 
                {
                    if (x == 1)
                    {
                        Console.WriteLine("左部队,杀出!");
                    }
                };
    
                boss.action += x =>
                {
                    if (x == 2)
                    {
                        Console.WriteLine("右部队,杀出!");
                    }
                };

    哎呦不错哦~ 更加简介了,而且有了linq的影子了。

    这样委托一步步进化到了最精简的Lambda。

    这样一来代码就干净利索,而且容易扩展,并且美观度也提高了。

    例子借鉴于:https://www.cnblogs.com/yinqixin/p/5056307.html

  • 相关阅读:
    vivado设计四:自定义IP核测试
    vivado设计三:一步一步生成自己的自定义IP核
    Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)
    vivado设计一:建立第一个入门工程(基于zybo)
    Vivado使用技巧:封装自己设计的IP核
    Vivado Logic Analyzer的使用
    Vivado Logic Analyzer的使用(二)
    Vivado Logic Analyzer的使用(一)
    Vivado Logic Analyzer的进一步探讨
    强大的Vivado IP工具——自定义IP的使用
  • 原文地址:https://www.cnblogs.com/yingxl/p/8980141.html
Copyright © 2011-2022 走看看