C#中的'=>'语法是什么意思?


81

我只是在这个论坛的一些问题中提到了这种语法,但是Google和其他搜索引擎往往会在搜索中屏蔽除字母和数字之外的任何内容,因此无法搜索出“ =>”。

有人能告诉我它是什么以及如何使用吗?


Answers:


84

它是lambda运算符。

从C#3到C#5,仅用于lambda表达式。这些基本上是C#2中引入的匿名方法的较短形式,但也可以转换为表达式树

举个例子:

Func<Person, string> nameProjection = p => p.Name;

等效于:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

在这两种情况下,您都将创建一个带有Person参数的委托,并返回该人的姓名(作为字符串)。

在C#6中,相同的语法用于表示体成员,例如

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

也可以看看:

(实际上还有许多类似的问题-尝试使用lambdalambda-expressions标签。)


1
由于问题没有说明所要询问的确切情况,因此也许考虑更新此答案以包含新的表达式主体成员语法?
Lasse V. Karlsen

1
好的:)刚来到这里是因为这个问题被用作重复结账的目标,因此认为最好有1个答案,而不是在其他情况下寻找另一个答案:)
拉西五世

14

这意味着很棒。例如

x => x + 1

表示一个将x作为参数并返回其后继方法的方法。

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

通过调用MethodInfo持有的方法将事件处理程序分配给按钮。


14

这是一种更简明的方法符号形式。以下内容大致等效:

// explicit method
int MyFunc(int pParam) {
   return pParam;
}

// anonymous (name-less) method
// note that the method is "wrapped" up in a hidden object (Delegate) this way
// so there is a very tiny bit of overhead compared to an explicit method
// (though it's really the assignment that causes that and would also happen
// if you assigned an explicit method to a reference)
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };

// lambda expression (also anonymous)
// basically identical to anonymous method,
// except with everything inferred as much as possible, intended to be minimally verbose
Func<int, int> MyFunc = x => x;

// and => is now also used for "expression-bodied" methods
// which let you omit the return keyword and braces if you can evaluate
// to something in one line
int MyFunc(int pParam) =>
   pParam;

可以将lambda表达式想成是“给了一些东西,返回了一些东西”。在上面的示例中,lambda表达式x => x表示“给定x,返回x”,尽管lambda表达式不一定需要返回某些内容,在这种情况下,您可能将它们读为“给定x,对x进行处理”。

还要注意,有三种东西叫做“委托”,一开始可能会很混乱。

匿名方法使用delegate关键字,但定义了没有名称的方法:

Func<int, int> = delegate (int x) { return x; };

将方法(匿名,显式或lambda)分配给引用会导致隐藏 Delegate创建包装对象,从而该方法。(基本上是一种“托管函数指针”。)

然后,您还可以使用关键字声明命名方法签名delegate

public delegate int TestFunc(int x, int y);

TestFunc myFunc = delegate (int x, int y) { return x + y; };

这将声明一个命名签名TestFunc,该签名使用两个ints并返回一个int,然后声明该类型的委托引用,然后为该委托引用分配具有匹配签名的匿名方法。


10

这是msdn的一个简单示例

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

=>之前的所有内容均为输入参数,表达式之后的所有内容均为输入参数。您可以有多个输入参数。Lambda主要与Linq一起使用。


8

而不是像这样使用匿名方法:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

您只需这样写:

somevar.Find(n => n < 10);

它将根据返回值采用数据类型。


3

=>令牌支持两种形式:作为拉姆达操作者和作为一个分离器的成员名和在表达式主体定义的成员实现。

Lambda运算子

在lambda表达式中,lambda运算符=>将左侧的输入变量与右侧的lambda主体分隔开。

以下示例将LINQ功能与方法语法一起使用,以演示lambda表达式的用法:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

表达体定义

表达式主体定义具有以下常规语法:

member => expression;

其中expression是有效的表达式。请注意,仅当成员的返回类型为void或成员是构造函数,终结器或属性集访问器时,表达式才可以是语句表达式。

下面的示例显示了Person.ToString方法的表达式主体定义:

public override string ToString() => $"{fname} {lname}".Trim();

它是以下方法定义的简写形式:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

4
如果您要从其他网站复制并粘贴答案,请至少包含指向来源的链接。
Knelis

1

它基本上意味着“进入”,就像参数一样

MyObjectReference => MyObjectReference.DoSomething()

通常,您使用它们将函数作为参数传递给方法,或者传递给LINQ语句

MyCollection.Where(myobj => myobj.Age>10)

例如。


0

它是lambda表达式的语法的一部分。Lambda表达式本质上是代理或匿名方法的缩写形式。为了说明,假设我有一个与字母匹配的字符串数组。我可以使用下面的LINQ表达式选择包含大于“ E”的值的数组的成员:

var someLetters = Alphabet.Where(l => l>“ E”);

“ =>”左侧的lambda表达式部分标识测试的变量名(设置为字母的各个成员),而“ =>”右侧的lambda表达式部分标识处理。在这种情况下,该处理将产生一个布尔值,Where逻辑将使用该布尔值来确定字母表的每个成员是否传递给someLetters数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.