什么是符号“=>”在这个C#代码中执行我的方法?

时间:2009-10-28 23:01:13

标签: c# c#-3.0

我最近在这里问了一个问题,有人提供了这个答案:

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

那是什么=>在做什么?这是我第一次看到这个。

3 个答案:

答案 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。这是一个方便的小家伙,可以帮助您的代码更易读,更简洁。