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

    创建代理人之前先定义委托: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);

委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法的更多相关文章

  1. C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  2. [转]C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  3. C#委托Action、Action<T>、Func<T>、Predicate<T>系统自带的委托

    C#委托Action.Action<T>.Func<T>.Predicate<T>   CLR环境中给我们内置了几个常用委托Action. Action<T& ...

  4. Action<T>和Func<T>

    Action<T>和Func<T>都是泛型委托. Action<T>表示委托可以引用一个viod返回类型的方法,至于方法是带几个参数,什么类型的参数,由后面的泛型决 ...

  5. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  6. 泛型委托Action与ActionT

    以前都是自己写委托,其实系统内部给我们系统了委托的. Action ——委托的非泛型版本就是一个无参数无返回值的委托. Action<T>——委托的泛型版本是一个无返回值,但是参数个数及类 ...

  7. C#学习笔记:泛型委托Action<T>和Fun<TResult>

    转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类 ...

  8. C#语法糖之第五篇: 泛型委托- Action<T>

    因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到 ...

  9. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  10. Action<T>和Func<T>委托

    Action<T>和Func<T>委托 泛型Action<T>委托和Func<T>委托是系统定义的两个泛型委托. Action<T>委托表示 ...

随机推荐

  1. UML建模——活动图(Activity Diagram)

    活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流 •活动图是一种表述过程基理.业务过程以及工作流的技术 ...

  2. C++中操作符——学习笔记

    1.箭头操作符 用于指针. 使用容器vector存指针,迭代器是指针需要 解引用后再解引用才是数据.图中漏掉了iter++ 记得要delete 2.算术运算符 %:获得余数. 优先级. 溢出: 除法的 ...

  3. linux中导入sql文件

    在linux中导入sql文件的方法分享(使用命令行转移mysql数据库) 因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql ...

  4. 转 oracle healthcheck

    ##sample 0 https://carlos-sierra.net/2013/11/01/a-healthy-way-to-do-an-oracle-database-health-check/ ...

  5. oracle存储过程(带参数的存储过程)

    带参数的存储过程 举例:为指定的员工涨100元的工资,打印涨前和涨后的工资 如果带参,需要指定是输入参数还是输出参数 create or replace procedure raisesalary(e ...

  6. Java Audio : Playing PCM amplitude Array

    转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-audio-playing-pcm-amplitude-array.html ...

  7. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

  8. 常用HTML转义字符,html转义符,JavaScript转义符,html转义字符表,HTML语言特殊字符对照表(ISO Latin-1字符集)

    HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...

  9. Selenium WebDriver原理

    WebDriver原理 WebDriver是按照Server-Client的经典设计模式设计的. Server端就是RemoteServer,可以是任意的浏览器,当我们的脚本启动浏览器后,该浏览器就是 ...

  10. iOS-Xib获取view尺寸的问题

    用xib创建的视图,我们一般要在控制器中获取对应的view尺寸,但经常我们没法获取到,或者获取的不准 如果通过xib加载出来的view尺寸是不正确的, 在xib中这个view不管你怎么设置都是治标不治 ...