在这段C#代码中,我的方法后面的符号“=>”是做什么用的?

5

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

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

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

Lambda运算符。根据我所读的,当大声说出来时,它的发音是“goes to”(只是作为附注)。 - Michael Todd
1
有关更多信息,请访问http://msdn.microsoft.com/en-us/library/bb397687.aspx。 - Michael Todd
3个回答

19

那是lambda运算符。你定义了一个匿名函数,它接受两个参数(s,args)(类型说明符省略),该函数的主体是在"=>"符号之后出现的内容。

从概念上讲,它与以下代码相同:

...
client.DownloadStringCompleted += Foo;
}

void Foo(object sender, EventArgs args)
{
    if (args.Error == null && !args.Cancelled)
    {
        MessageBox.Show();
    }
};

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> 类型的树形结构,用于表示 lambda 表达式中的代码,并以可遍历的对象模型形式存在。这允许在运行时稍后解释 lambda 表达式(请查看 LINQ 的“查询表达式”)。


6

=> 是Lambda操作符。它是一个很方便的小家伙,可以帮助你使代码更易读和不那么混乱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接