【发布时间】:2010-09-22 08:21:59
【问题描述】:
我刚刚在这个论坛的一些问题中遇到了这种语法,但谷歌和任何其他搜索引擎往往会在搜索中屏蔽除字母和数字之外的任何内容,因此无法搜索出“=>”。
那么谁能告诉我它是什么以及它是如何使用的?
【问题讨论】:
我刚刚在这个论坛的一些问题中遇到了这种语法,但谷歌和任何其他搜索引擎往往会在搜索中屏蔽除字母和数字之外的任何内容,因此无法搜索出“=>”。
那么谁能告诉我它是什么以及它是如何使用的?
【问题讨论】:
这是一种更简洁的方法表示法。以下大致等价:
// 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,然后声明该类型的委托引用,然后为其分配一个具有匹配签名的匿名方法。
【讨论】:
这是 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();
另见:
(确实有很多类似的问题——试试lambda 和lambda-expressions 标签。)
【讨论】:
它是 lambda 表达式语法的一部分。 lambda 表达式本质上是委托或匿名方法的缩写形式。为了说明,假设我有一个与字母匹配的字符串数组。我可以使用以下 LINQ 表达式挑选出该数组中包含大于“E”的值的成员:
var someLetters = alphabet.Where(l => l > "E");
“=>”左侧的 lambda 表达式部分标识测试的变量名称(设置为字母表的各个成员)和“=”右侧的 lambda 表达式部分>”标识处理。在这种情况下,处理会生成一个布尔值,Where 逻辑使用该布尔值来确定是否将字母表的每个成员传递给 someLetters 数组。
【讨论】:
这是一个来自 msdn 的简单示例
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
=> 前面的都是输入参数,后面的就是表达式。您可以有多个输入参数。 Lambda 主要用于 Linq。
【讨论】:
这意味着令人敬畏。例如
x => x + 1
表示一个以x为参数并返回其后继的方法。
button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));
通过调用 MethodInfo 持有的方法将事件处理程序分配给按钮。
【讨论】:
它基本上意味着“进入”,就像一个参数
MyObjectReference => MyObjectReference.DoSomething()
通常您使用它们将函数作为参数或在 LINQ 语句中传递给方法
MyCollection.Where(myobj => myobj.Age>10)
例如。
【讨论】:
而不是像这样使用匿名方法:
somevar.Find(delegate(int n)
{
if(n < 10)
return n;
});
你可以这样写:
somevar.Find(n => n < 10);
根据返回值取数据类型。
【讨论】: