2009-10-28 18 views
5

最近,我问了一个问题在这里,有人提供了这样的回答:在这个C#代码中,我的方法在做什么符号“=>”?

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

Lambda运算符。根据我读过的内容,当大声说出时,它会变成“去”(就像旁注一样)。 – 2009-10-28 23:05:56

+1

http://msdn.microsoft.com/en-us/library/bb397687.aspx更多信息.... – 2009-10-28 23:07:06

回答

10

基本上它说:“我给你这个(s,b)”,你正在返回我s*b或东西,如果你正在使用拉姆达与表达,但它可以是这样的:我给你这个(s,b),做一些与他们喜欢语句块:

{ 
    int k = a+b; 
    k = Math.Blah(k); 
    return k; 
} 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~

A 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表达式(请检查LINQ的“查询表达式”)

19

这是lambda运算符。您定义了一个匿名函数,它接受两个参数(s,args)(省略了类型说明符),并且所述函数的主体是出现在=>符号后面的内容。

它在概念上与此相同:

... 
client.DownloadStringCompleted += Foo; 
} 

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

的=>是Lambda Operator。这是一个方便的小家伙,可以帮助您使代码更具可读性,更简洁。