csharp中的Action,Func,Predicate

我们知道委托非常强大,首先我们要使用委托解决的就是对象之间信息的“逆向传递问题”。

其次,其实委托还有很多的用途。(匿名方法、Lambda表达式,和泛型结合)最后,我们在学到一定程度的时候,

我们必须研究底层原理。(比如我们学EntityFramework,linq各种查询,扩展方法)

一、匿名方法、Lambda表达式

1、匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate、方法参数、方法体,这种方法是匿名方法。

匿名方法的好处:将具体方法和委托直接关联到一起,如果我们基于委托只需要一个方法的时候,匿名方法肯定是显得简单。

2. Lambda表达式:在C#3.0出现的。使用这种表达的可以更简练的编写代码块。

      CalculatorDelegate cal3 = (int a, int b) => { return a + b; };
      CalculatorDelegate cal4 = (a, b) => a - b;

【1】在Lambda表达式中参数类型可以是明确类型,也可以是推断类型。
【2】如果是推断类型,则参数类型可以由编译根据上下文自动推断出来。
【3】运算符=> 读作goes to  ,运算符左边输入参数(如果有),右边是表达式或语句块。
【4】表达式两种方式:

         (input  args)=>表达式
         (input  args)=>{ 语句1;语句2;语句3....}

 【5】Lambda表达式和匿名方法的比较
  
          第一、Lambda表达式本身就是匿名方法。
          第二、Lambda表达式允许不指明参数类型,但是匿名方法必须要明确。
          第三、Lambda表达式允许单一的表达式或多条语句组成,而匿名方法不允许单一表达式。


二、自定义泛型委托

1.为什要使用泛型委托?普通委托在数据类型的限定上非常严格的。有时候我们需求变化,可能适应不了。

2.泛型委托定义:本质上和泛型方法是非常相似的,泛型委托关联的时候,可以是具体方法、匿名方法、lambda表达式

3.问题引出:仔细研究我们写的泛型委托:    public delegate T MyGenericDelegate<T>(T param1, T param2);

  试想:如果我们使用4个参数?5个参数?8个参数?按照目前思路,不得不定义很多这种泛型委托!很麻烦!

三、系统泛型委托

  针对问题的解决:.NET平台早就为你考虑了这种简单的泛型委托,那就是人家已经定义好了,我们可以直接使用!

  两种方式:一种是有返回值Func<args>,一种返回bool的Predicate<args>,一种是没有返回值的Action<args>。
   
  Action<>在多线程中用的非常多。

  Func<>,Predicate<>在扩展方法中用的非常多。

  请直接参考实例代码。

  结论:泛型委托作为方法参数,实际上传递的是一个具体方法或一个Lambda表达式! (多态一种表现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值