C# 从0到实战 lambda表达式和Expression-bodied表达式

什么是lambda表达式(λ表达式)

用过其他函数式语言的人可能对闭包和惰性计算很熟悉,没有用过的人也多多少少的听说过Lambda表达式。那么到底什么是lambda表达式呢?按我的看法是创建一个匿名的函数对象,从而达到简化代码的目的。以下是lambda表达式的用法:

(arg_1,...)=>{ //codes }

 Lambda表达式有时在某些资料上也被称为 箭头函数。

lambda和闭包

要搞清楚lambda表达式的作用,记得搞清楚什么是闭包?所谓闭包,引用 《JavaScript 高级程序设计》 中的一句话来解释它:“闭包是指有权访问另一个函数作用域中的变量的函数”。按我自己的理解就是在一个父函数中返回一个子函数,具体如下:

//...

Object  demo(arg_1)  {
    return (arg_1)=>{ return PI;}
}

//..

这样就可以达到少定义一个函数/方法的目的,让代码更干净(clean)。

由于C#7.0以及之前的版本都不能像go语言一样返回多个值,所以没有办法完全发挥闭包的优势;然而自从C#7.1开始支持元组,可以返回一个值类型的对象。所以上面的例子还可以改写:

//...

Object (double v_1, double v_2)  demo(arg_1,arg_2)  {
    return (arg_1)=> { return (PI,PI);}
}

//..

 

高阶函数

高阶函数就是可以将一个函数作为对象传递给另一个函数。如果有对其他语言或者对C#有所了解,就会想起了委托——另一个将函数作为对象传递给函数的方式,即使是C/C++也有对应的函数指针和委托构造方法(C++17)与之类似.

高阶函数在C#里面就是传递一个Lambda表达式作为参数,这么做的好处是可以让代码更简洁,典型的例子就是Javascript 的JQERY的使用方法了,然而在C#中的写法是这样的:

//...

Object  demo(arg_1)  {
   Console.WirteLine(arg_1);
}

//..

//使用表达式方式调用 
demo(x=>"hello") ;
//使用代码块方式调用 
demo(x=>{return "hello"}) ;

 

posted @ 2022-03-15 17:52  神魔之力  阅读(100)  评论(0编辑  收藏  举报