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

问题描述 投票:69回答:8

我刚刚在本论坛的一些问题中提到了这种语法,但Google和任何其他搜索引擎都会在搜索中阻止除字母和数字之外的任何内容,因此无法搜索“=>”。

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

c# syntax
8个回答
78
投票

这是lambda运算符。

从C#3到C#5,这仅用于lambda expressions。这些基本上是C#2中引入的anonymous methods的较短形式,但也可以转换为expression trees

举个例子:

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标签。)


15
投票

这意味着很棒。对于例如

x => x + 1

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

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

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


11
投票

它是函数符号的另一种形式。以下大致相同:

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

// delegate function
Func<int, int> MyFunc = delegate(int pParam) { return pParam; };

// lambda expression
Func<int, int> MyFunc = x => x;

想想一个lambda表达式,“给出一些东西,返回一些东西”。在上面的例子中,函数x => x说“给定x,返回x”。 (虽然lambda表达式不一定需要返回某些东西,在这种情况下,你可能会将它们读作“给定x,用x做一些事情”。)


8
投票

这是msdn的一个简单例子

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

=>之前的任何内容都是输入参数,之后的任何内容都是表达式。您可以拥有多个输入参数。 Lambdas主要用于Linq。


6
投票

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

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

你只需这样写:

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

它将根据返回值获取数据类型。


1
投票

=>标记以两种形式支持:作为lambda运算符,作为成员名称的分隔符和表达式主体定义中的成员实现。

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();
}

0
投票

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

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数组。

© www.soinside.com 2019 - 2024. All rights reserved.