C# 委托与lamada表达式

        最近在研究C# 一些基础的语法,觉得委托和lamada表达式这里还比较难懂,有很多细节性的地方,在这里分享给大家哈。

        我们在C和C++ 里边利用函数指针将对方法的引用传递给另一个方法,从而达到代码间的交互,在C#里边就提供了这么一种比较方便的方式叫做委托,委托能够捕捉到对方法的引用,并像传递其他对象那样传递该应用。                

        所有的委托类型都直接或者间接派生自 System.Delegate,委托分为好几个类型,这个可以根据需求来自定义委托,

       Action :代表无返回值,可以支持传递多个参数,最高可以支持16个参数(具体的还是得看C#版本)

        Func  :   代表有返回值,可以传递多个参数,但是需要主要的,他总是返回最后一个值

 委托可以当实参传递。就是我们所说的引用委托,委托是不能实例化的,在C#2.0以后,他会自动转化成实例的对象,所以就省了再实例对象这一步,委托不能是显式的基类,所以有时候为了提高代码的可读性,减少复杂性,还是可以考虑使用使用委托的。

         来看这个例子,我们将委托当做方法传递,

这个时候代码就显得有点冗长,所以为了精简代码,并且易于理解,C#2.0引入了非常精简的语法创建委托,将这种方法称为匿名方法,在C#3.0的时候称为lamada表达式,这两种语法统称为匿名函数。

        lamada表达式分为两种,语句lamada和表达式lamada,lamada表达式的目的是在需要给予很简单的方法生成委托时, 避免再声明好多个不必要的成员。语句lamada由形参列表,Lamada操作符=> 和代码块构成;

我把这个例子简化了一下,也就是说咱们直接用lamada表达式的话,刚好省了一步方法的调用,注意看一下,他的形参和代码块都在,但是修饰符和方法名没有了;我们看这个代码块里的代码是可以将这段代码理解为,将整数 a 和整数 b 用于返回(a > b)的结果,我们把这类方法称之为我们所说的匿名函数。

        其实lamada表达式并没有说就一定得显式的指定类型, 但是如果说指定类型更容易提高可读性的话,也是可以这样做的,但是一旦指定类型,你所有的参数都必须指定类型,而且还得和委托的参数类型完全一致。

        我们发现,把他的类型取消以后,编译器也是可以识别出来的。 

        如果有参数的话,在()里边,我们就必须传参数,但是如果无参,可以不用传递参数。lamada语句没有语句限制,但是我们一般都会限制在两三个语句之内

        这个就是lamada无参的表现 。

        语句lamada可以不指定方法名,参数类型和返回类型,表达式lamada更便捷。所有语句lamada的代码块都只有一个return语句,唯一需要的就是要返回的表达式。这正是表达式lamada的作用,他只包含要返回的表达式,完全没有语句块。所以lamada表达式并不是只有Func<int,int,bool>这种类型,他只是与这种类型比较兼容,你也可以指定其他类型,在这里要注意的是不能对匿名方法使用typeof()操作符,只要将匿名方法转化为具体类型后才能调用GetType()。

        匿名方法必须显式指定每个参数的类型,而且必须有代码块,参数列表和代码块之间不使用Lamada操作符=>。匿名方法在某些情况下能够完全省略参数列表。也就是说它支持无参。

        委托不具备结构相等性。也就是说不能将一个委托类型的对象引用转换成一个不相关的委托类型,即使两者的形参和返回类型完全一致。这个时候如果我们需要引用一个委托的话,就是创建一个新的委托并且让他引用旧委托的Invoke方法

         C#4.0添加的对可变性的支持,就是可在委托类型之间进行引用转换。

        CLR不知道Lamada,但是当他遇到匿名方法是,会转化成特殊的结构体(类,字段,函数)等等,这就省了开发人员自己去实现代码。 

        如果我们在lamada表达式的外部定义变量,在lamada表达式内部引用的话,这种模式称之为lamada表达式外部变量。

这个时候外部变量就会被lamada表达式捕捉,从而获取值。 

       小弟写的不好,还请路过的大佬们多多指教,有则改之无则加勉。多谢!!!         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值