我最近在这里问了一个问题,有人提供了这个答案:
private void button1_Click(object sender, EventArgs e)
{
var client = new WebClient();
Uri X = new Uri("http://www.google.com");
client.DownloadStringCompleted += (s, args) => //THIS, WHAT IS IT DOING?
{
if (args.Error == null && !args.Cancelled)
{
MessageBox.Show();
}
};
client.DownloadStringAsync(X);
}
那是什么=>在做什么?这是我第一次看到这个。
答案 0 :(得分:19)
这是lambda运算符。你定义了一个匿名函数,它接受两个参数(s,args)(省略了类型说明符),并且所述函数的主体是在=>之后出现的函数。符号
概念上与此相同:
...
client.DownloadStringCompleted += Foo;
}
void Foo(object sender, EventArgs args)
{
if (args.Error == null && !args.Cancelled)
{
MessageBox.Show();
}
};
答案 1 :(得分:10)
基本上它说“我给你这个(s,b)
”并且你正在给我s*b
或者其他东西,如果你正在使用带表达式的lambda,但它可能是这样的:我在给你这个(s,b)
并在语句块中对它们做了一些事情,如:
{
int k = a+b;
k = Math.Blah(k);
return k;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
Lambda
表达式是代替委托实例编写的未命名方法。编译器立即将lambda表达式转换为:
delegate int Transformer(int i);
class Test{
static void Main(){
Transformer square = x => x*x;
Console.WriteLine(square(3));
}
}
我们可以这样重写:
delegate int Transformer(int i);
class Test{
static void Main(){
Transformer square = Square;
Console.WriteLine(square(3));
}
static int Square (int x) {return x*x;}
}
lambda表达式具有以下形式:
(parameters) => expression or statement-block
在前面的示例中,只有一个参数x
,表达式为x*x
在我们的示例中,x对应于参数i,而表达式x*x
对应于返回类型int
,因此与Transformer委托兼容;
delegate int Transformer ( int i);
lambda表达式的代码可以是语句块而不是表达式。我们可以按如下方式重写我们的例子:
x => {return x*x;}
类型为Expression<T>
的表达式树,表示可遍历对象模型中lamda表达式内的代码。这允许lambda表达式稍后在运行时进行编译(请检查LINQ的“查询表达式”)
答案 2 :(得分:6)
=&gt;是Lambda Operator。这是一个方便的小家伙,可以帮助您的代码更易读,更简洁。