zoukankan      html  css  js  c++  java
  • 委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法

    一、举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人。

        创建代理人之前先定义委托:public delegate string BuyColaDelegate(string drink);

        创建代理人:BuyColaDelegate delegate = new BuyColaDelegate();(错误代码)

        那么问题来了,这个代理人需要绑定一个方法啊,不然他知道自己去干啥,所以需要创建一个真正的代理人: 

        BuyColaDelegate delegate = new BuyColaDelegate(BuyCola);  

        public static string BuyCola(string drink)
        {
          try
          {
            WriteLine($"购买:{drink}");

            return "购买完成";
          }
          catch (Exception ex)
          {
            WriteLog(LogType.ERROR, "Program", "BuyCola", ex.ToString());
            return null;
          }
        }

        以上才是创建了一个真正的代理人,然后代理人一旁待命。二狗子这时给代理人发出了去买可乐的命令:

        string res = delegate("可乐");

        当res == "购买完成",二狗子就舒服的喝上了冰镇可乐,NM,简直爽歪歪。

      注:

      委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

      delegate我们常用到的一种声明,委托至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。


    二、二狗子有点郁闷,我就买瓶可乐而已,还要我自己搞一个代理人,烦死了。有没有现成的代理人啊,给我用用,Action出场:

        Action ac1 = new Action();(错误代码)

        这个代理人能力有点弱鸡,一个参数都带不了,而且还不能有返回值。

        public static void BuyCola()
        {
          try
          {
            WriteLine("购买:可乐");

          }
          catch (Exception ex)
          {
            WriteLog(LogType.ERROR, "Program", "BuyCola", ex.ToString());
          }
        }

        Action ac1 = new Action(BuyCola);

        二狗子这时又爽歪歪的给这个代理人发出了去买可乐的命令:ac1 ();

      注:  

      Action是无返回值的泛型委托。

         Action 表示无参,无返回值的委托

      Action<int,string> 表示有传入参数int,string无返回值的委托

         Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

           Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

      Action至少0个参数,至多16个参数,无返回值。


    三、二狗子这个懒小孩又郁闷了(怎么老是郁闷),可乐喝完了,我还想买冰镇西瓜怎么办,难道我再搞个BuyWatermelon(),

        再把里面参数写死?不!另一个Action上场:

        Action<string> ac2 = new Action<string>();(错误代码)

        public static void BuyDrink(string drink)
        {
          try
          {
            WriteLine($"购买:{drink}");

          }
          catch (Exception ex)
          {
            WriteLog(LogType.ERROR, "Program", "BuyDrink", ex.ToString());
          }
        }

        Action<string> ac2 = new Action<string>(BuyDrink);

        二狗子这时再次爽歪歪的给这个代理人发出了去买西瓜的命令:ac2 ("西瓜"); 二狗子如愿以偿的吃上了西瓜(吃个瓜真不容易)。

        ac2 ("雪碧");ac2 ("山珍海味");ac2 ("满汉全席");........


    四、二狗子是个善于思考的人,他在想代理人去买东西,我得知道结果啊,我让他买西瓜,回来跟我说没买到,谁知道是不是半路被他干掉了呢?

        Func<string,string> func1 = new Func<string, string>(BuyDrink);

        public static string BuyDrink(string drink)
        {
          try
          {
            WriteLine($"购买:{drink}");

            return "购买完成";

          }
          catch (Exception ex)
          {
            WriteLog(LogType.ERROR, "Program", "BuyDrink", ex.ToString());

            return null;
          }
        }

        这样二狗子就知道了结果,代理人心里只能大喊MMP。

      注:

       Func是有返回值的泛型委托

       Func<int> 表示无参,返回值为int的委托

       Func<object,string,long> 表示传入参数为object, string 返回值为long的委托

       Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

       Func<T1,T2,T3,int> 表示传入参数为T1,T2,T3(泛型)返回值为int的委托

       Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void,参数最后一个type表示返回值类型


    五、

       predicate 是返回bool型的泛型委托

       predicate<int> 表示传入参数为int 返回bool的委托

       Predicate有且只有一个参数,返回值固定为bool

       例:public delegate bool Predicate<T> (T obj)

         Predicate<string> pre1 = new Predicate<string>(XXX);

  • 相关阅读:
    Linux -- 如何减少IO过程中的CPU copy
    Linux -- 在多线程程序中避免False Sharing
    智能文件选择列表—— bat 批处理
    Windows NTFS 符号链接 与 Linux 软连接
    【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE
    Qt creator中文输入—fctix-qt5 源码编译 libfcitxplatforminputcontextplugin.so
    安装 Qt 及所需 gcc 等
    虚拟机安装 deepin Linux 注意事项
    deepin 常用设置
    VIM常用快捷键
  • 原文地址:https://www.cnblogs.com/lu-yuan/p/11327361.html
Copyright © 2011-2022 走看看