我最近在这里问了一个问题,有人提供了这个答案:
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);
}
Run Code Online (Sandbox Code Playgroud)
那是什么=>做什么?这是我第一次看到这个.
Ed *_* S. 19
那是lambda运算符.你定义了一个匿名函数,它接受两个参数(s,args)(省略了类型说明符),并且所述函数的主体是在=>符号后出现的.
它在概念上与此相同:
...
client.DownloadStringCompleted += Foo;
}
void Foo(object sender, EventArgs args)
{
if (args.Error == null && !args.Cancelled)
{
MessageBox.Show();
}
};
Run Code Online (Sandbox Code Playgroud)
Tar*_*rik 10
基本上它说"我给你这个(s,b)",你回来了我s*b或者其他什么,如果你正在使用带表达式的lambda,但它可以是这样的:我给你这个(s,b),并在语句块中做一些事情,如:
{
int k = a+b;
k = Math.Blah(k);
return k;
}
Run Code Online (Sandbox Code Playgroud)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
甲Lambda表达是写入到位委托实例的未命名的方法.编译器立即将lambda表达式转换为:
delegate int Transformer(int i);
class Test{
static void Main(){
Transformer square = x => x*x;
Console.WriteLine(square(3));
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以像这样重写它:
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;}
}
Run Code Online (Sandbox Code Playgroud)
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;}
Run Code Online (Sandbox Code Playgroud)
表达式树,类型Expression<T>,表示可遍历对象模型中lamda表达式内的代码.这允许lambda表达式稍后在运行时进行编译(请检查LINQ的"查询表达式")