2009-07-28 315 views
13

请原谅我,如果这个尖叫新手但=>在C#中的含义是什么?上周我正在做一个演讲,这个运营商(我认为)是在ORM的背景下使用的。在我回到笔记之前,我并没有真正关注语法的细节。“=>”是什么意思?

+0

这是一个重复。我找不到那一个。 – 2009-07-28 19:57:20

+0

虽然这很难搜索。即使在Google上。 – 2009-07-28 20:16:51

+0

他不知道它被称为“lambda操作符”。 – 2009-07-28 20:21:40

回答

13

在C#的lambda operator被写入 “=>”(通常是发音为 “” 当朗读)。这意味着左侧的参数被传递给右侧的代码块(lambda函数/匿名委托)。所以如果你有一个Func或者Action(或者他们的任何一个具有更多类型参数的表兄弟),那么你可以给它们分配一个lambda表达式,而不需要实例化一个委托或者有一个单独的延迟处理方法:

//creates a Func that can be called later 
Func<int,bool> f = i => i <= 10; 
//calls the function with 12 substituted as the parameter 
bool ret = f(12); 
+4

我从来没有注意到当你将lambda与'小于或等于'粘在一起时有多混淆。它最终看起来像所有箭头指向我。 – 2009-07-28 20:09:30

1

这是一个lambda运算符,是lambda expression的一部分。

所有lambda表达式使用拉姆达 运算符=>,它读作 “去 于”。 lambda 运算符的左侧指定输入 参数(如果有的话),并且右侧 包含表达式或语句 块。 lambda表达式x => x * x被读取为“x转到x次x”。

7

它是简写为lambda的简写。

i => i++ 

是(排序的)一样写作:

delegate(int i) 
{ 
    i++; 
} 

在的上下文中:

void DoSomething(Action<int> doSomething) 
{ 
    doSomething(1); 
} 

DoSomething(delegate(int i) { i++; }); 
//declares an anonymous method 
//and passes it to DoSomething 

,它是(排序的)一样写作:

void increment(int i) 
{ 
    i++; 
} 

只是没有给它一个名字,它可以让你在线声明一个函数,称为“匿名”函数。

3

当大声说出运算符是lambda时(转到)运算符有助于定义您在lambda中定义的匿名委托。

一个常见的地方看到这是一个事件处理程序。通过使用

this.Loaded += (o, e) => { 

// code 

} 

您已经定义了一个匿名方法处理Loaded事件(它没有名字):你会经常有由拉姆达用下面的代码来处理AA页面加载事件类型lambda表达式。它会读作“o,e去......用foo定义方法”。

1

这是声明匿名函数的语法,在C#中称为“lambda表达式”。

例如,(int p) => p * 2表示一个函数,它接受一个整数并将其乘以2。

+0

从技术上讲,整体(int p)=> p * 2是一个lambda表达式。 =>只是lambda运算符。 – 2009-07-28 20:17:30

3

这是“lambda操作符”,并且您将其读作“转至”。假设你有声明:

doSomething(x => x + " hi"); 

可以代替“=>”在你的心中有这样的:

doSomething(delegate (string x) { return x + " hi" }); 

正如你所看到的,它提供了一个速记的挫折感。编译器会计算出您传递的变量的类型,并允许您摆脱传递签名变量的代码的函数签名和包围。

8

由于没有人提到它,但在VB.NET你使用function关键字来代替=>,就像这样:

dim func = function() true 
'or 
dim func1 = function(x, y) x + y 

dim result = func() ' result is True 
dim result1 = func1(5, 2) ' result is 7