lambada表达式c#点不出来是啥原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambada表达式c#点不出来是啥原因相关的知识,希望对你有一定的参考价值。

在我们程序中,经常有这样一些需求:
1. 需要一个临时方法,这个方法只会使用一次,或者使用的很少。
2. 这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将其称之为“一句话方法”)。
没办法,这样的方法写起来真是吃力不讨好,比如一些按钮事件处理中,有些按钮点击就是弹出一个对话框,或者调用一下别的什么方法。比如下面的代码:
this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
private void btnRefresh_Click(object sender, EventArgs e)

BindData();

这个”Refresh”按钮就是做一下调用一下BindData()数据绑定的方法,为此我们不得不写一个新方法。好了,C# 2.0为我们提供了匿名方法:
this.btnRefresh.Click += delegate(object sender, EventArgs e) BindData(); ;
没劲的代码没了。想知道这种写法的幕后黑手么?
其实编译器还是在我们的后面干了一件龌龊的事情:它为我们产生了一个新的方法,它只是表面上为我们节省了代码。
privatevoidb__0(object sender, EventArgs e)

this.BindData();

看看这个编译器产生的方法的名称:
b_0,Test是这个匿名方法所放置的地方(因为这个按钮的时间我是放在一个Test方法里的) 还有一点需要注意的是,如果这个匿名方法是在实例方法里使用,那么编译器为我们生成的幕后方法也是实例方法,否则就是静态方法了。
是不是觉得匿名方法这东西很不错,减少了很多代码阿,但是匿名方法的使用还并不人性化,什么是人性化呢?比如你可以用自然的语言将程序代码读出来,这样才算人性化了.在.net 2.0中System.Collections.Generic命名空间下List里有一些新增的方法。比如Find,如果使用匿名方法我们如何调用呢:
books.Find(delegate(Book book)return book.Price < 50;);
代码是很简单,但是却无法朗读出来,来看看Lambda表达式的写法:
books.Find(book=>book.Price<50);这个Lambda表达式就可以这样阅读出来了:给你一本书,如果它的价格小于50则返回true。
好了,那我们就走进Lambda表达式吧:

将使用了Lambda表达式的程序集反编译后,我们发现,它实际上和匿名方法没有什么不同。Lambda的输入参数就对应着delegate括号里面的参数,由于Lambda表达式可以推断参数的类型,所以这里的参数无需声明。
Lambda操作符读作”Goes to”,它后面紧跟着表达式或者是语句块(这点和匿名方法也不同,匿名方法只能使用语句块而不能使用表达式),下面我就用实例来说明一下有那些类型的Lambda表达式:
//x的类型省略了,编译器可以根据上下文推断出来,后面跟着的是表达式

//x的类型省略了,编译器可以根据上下文推断出来,后面跟着的是表达式
x => x+1
deleage(int x)return x+1;
//后面跟着的是语句块
x=>return x+1;
delegate(int x)return x+1;
//输入参数也可以带类型,带类型后别忘记小括号哦
(int x) => x+1
delegate(int x)return x+1;
//也可以多个输入参数,逗号分隔,别忘记小括号
(x,y) => x+y
delegate(int x,int y)return x+y;
//无参的也行

() => 1

delegate()return 1;

对于Lambda表达式来说她的用法就是如此,但是在Lambda背后却有很多的故事和玄机。用Lambda表达式可以构建表达式树,而表达式树对于Linq来说就像树根对于树一样重要。在这里就不讨论表达式树的问题了,这个东西也不是三言两语能够说清楚的,等待时机成熟的时候我们再来进一步讨论。
参考技术A 那是扩展方法岂能你随便能点出来,你实现了IEnumerable接口即可!

lambada表达式

参考技术A

lambada表达式

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

C#表达式

C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:

(object argOne, object argTwo) => ; /*Your statement goes here*/

函数体多于一条语句的可用大括号括起。

类型

可以将此表达式分配给委托类型,如下所示:

delegate int del(int i);

del myDelegate=x=>return x*x;;

int j = myDelegate(5); //j=25

创建表达式目录树类型:

using System.Linq.Expressions;

//...

Expression <del>=x=>x*x;

=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。

Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。

使用基于方法的语法在 Enumerable 类中调用 Where 方法时(像在 LINQ to Objects 和 LINQ to XML 中那样),参数是委托类型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表达式创建委托最为方便。例如,当您在 System.Linq..::.Queryable 类中调用相同的方法时(像在 LINQ to SQL 中那样),则参数类型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五个输入参数的任何 Func 委托。同样,Lambda 表达式只是一种用于构造表达式目录树的非常简练的方式。尽管事实上通过 Lambda 创建的对象的类型是不同的,但 Lambda 使得 Where 调用看起来类似。

在前面的示例中,请注意委托签名具有一个 int 类型的隐式类型输入参数,并返回 int。可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为 int 类型的返回值。(以下几节中将对类型推理进行详细讨论。)使用输入参数 5 调用委托时,它将返回结果 25。

在 is 或 as 运算符的左侧不允许使用 Lambda。

适用于匿名方法的所有限制也适用于 Lambda 表达式。有关更多信息,请参见匿名方法(C# 编程指南)。

特殊

下列规则适用于 Lambda 表达式中的变量范围:

捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

在外部方法中看不到 Lambda 表达式内引入的变量。

Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。

Lambda 表达式中的返回语句不会导致封闭方法返回。

Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。

Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”,如下例:

string[] names="agen","balen","coure","apple";

string[] findNameA=Array.FindAll<string>(names,delegate(string v)return v.StartsWith("a"););

string[] findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));

上面中两个FindAll方法的反编译代码如下:

string[] findNameA=Array.FindAll<string>(names,delegate(string v)return v.StartsWith("a"););

string[] findNameB=Array.FindAll<string>(names,delegate(string v)return v.StartsWith("a"););

从而可以知道“Lambda表达式”与“匿名方法”是可以划上等号的,只不过使用“Lambda表达式”输写代码看上去更直观漂亮,不是吗?

Lambda表达式的语法格式:

参数列表 => 语句或语句块[1]

其中“参数列”中可包含任意个参数(与委托对应),如果参数列中有0个或1个以上参数,则必须使用括号括住参数列,如下:

x => x + 1                              // Implicitly typed, expression body

x => return x + 1;                   // Implicitly typed, statement body

(int x) => x + 1                        // Explicitly typed, expression body

(int x) => return x + 1;             // Explicitly typed, statement body

(x, y) => x * y                         // Multiple parameters

() => Console.WriteLine()               // No parameters

async (t1,t2) => await t1 + await t2    // Async

delegate (int x) return x + 1;       // Anonymous method expression

delegate return 1 + 1;               // Parameter list omitted

以上是关于lambada表达式c#点不出来是啥原因的主要内容,如果未能解决你的问题,请参考以下文章

高效开发:JDK1.8的Lambada表达式

java lambada表达式

一篇文章带你总结 Lambada 表达式常见使用

刚用eclipse发现点不出方法和对象,点后面也不出现了的原因是啥?

Java Lambda Stream

思维导图整理大厂面试高频数组26: 合并区间中详解lambada表达式和toArray()用法, 力扣56