[深入学习C#]匿名函数、委托和Lambda表达式

匿名函数

  匿名函数(Anonymous Function)是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情)。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托;如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树。
  匿名函数有两种语法风格:Lambda表达式(lambda-expression)匿名方法表达式(anonymous-method-expression)。在几乎所有的情况下,Lambda表达式都比匿名方法表达式更为简介具有表现力。但现在C#语言中仍保留了后者,为了向后兼容。
  Lambda表达式:
    async可选 (匿名的函数签名)=> (匿名的函数体)
  匿名方法表达式:
    async可选 delegate (显式的匿名函数签名) 可选{代码块}

  其中匿名的函数签名可以包括两种,一种是隐式的匿名函数签名另一种是显式的匿名函数签名
    隐式的函数签名:(p)、(p1,p1)
    显式的函数签名:(int p)、(int p1,int p2)、(ref int p1,out int p2)
  匿名的函数体可以是表达式或者代码块。

  从上面我们可以看出,Lambda表达式的参数形式可以显式或者隐式类型化。在显式类型化参数列表中,每个参数的类型是显式声明的,在隐式类型化参数列表中,参数的类型是从匿名函数出现的上下文中推断出来的。
  当Lambda表达式只有一个具有隐式类型化参数的时候,参数列表可以省略圆括号,也就是说:
  (参数) => 表达式
  可以简写为
  参数 => 表达式

一些匿名函数的示例
  x => x + 1 //隐式的类型化,函数体为表达式
  x => {return x + 1;} //隐式的类型化,函数体为代码块
  (int x) => x + 1 //显式的类型化,函数体为表达式
  (int x) => {return x + 1;} //显式的类型化,函数体为代码块
  (x , y) => x * y //多参数
  () => Console.WriteLine() //无参数
  async (t1 , t2) => await t1 + await t2 //异步
  delegate (int x) {return x + 1;} //匿名函数方法表达式
  delegate {return 1 + 1;} //参数列表省略
  
Lambda表达式和匿名方法表达式的区别:
  ● 当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值