lambada表达式

 我来答
别名纯7
2022-11-07 · 超过46用户采纳过TA的回答
知道小有建树答主
回答量:285
采纳率:29%
帮助的人:7.5万
展开全部

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式