在这个C#代码中我的方法之后做什么符号"=>"?

Ser*_*pia 5 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);
}
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的"查询表达式")


Mar*_*ill 6

=>是Lambda运算符.这是一个方便的小家伙,可以帮助您的代码更具可读性,更少杂乱.