我只是在这个论坛的一些问题中提到了这种语法,但是Google和其他搜索引擎往往会在搜索中屏蔽除字母和数字之外的任何内容,因此无法搜索出“ =>”。
有人能告诉我它是什么以及如何使用吗?
Answers:
它是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();
也可以看看:
(实际上还有许多类似的问题-尝试使用lambda和lambda-expressions标签。)
这是一种更简明的方法符号形式。以下内容大致等效:
// 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
,该签名使用两个int
s并返回一个int
,然后声明该类型的委托引用,然后为该委托引用分配具有匹配签名的匿名方法。
的=>令牌支持两种形式:作为拉姆达操作者和作为一个分离器的成员名和在表达式主体定义的成员实现。
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();
}