2011-07-26 109 views
15

对不起,要求全部,但我是一个老手Vb.net家伙谁转移到C#。我有下面这段代码,当(在这种情况下)postAsync方法被激发时似乎激活。我只是不;吨了解代码的作用(如下): -什么是+ =(o,arg)=>实际实现?

app.PostCompleted += 
    (o, args) => 
    { 
     if (args.Error == null) 
     { 
      MessageBox.Show("Picture posted to wall successfully."); 
     } 
     else 
     { 
      MessageBox.Show(args.Error.Message); 
     } 
    }; 

如果有人能说明什么+ =(O,参数)=>实际上acheiving我会如此感激.. ..

非常感谢提前。 Tim

回答

26

(o,args) =>定义了一个lambda表达式,它带有两个名为oargs的参数。这些参数的类型根据PostCompleted的类型推断(如果PostCompletedEventHandler,那么它们将分别是类型ObjectEventArgs)。表达式的主体随后在=>之后。

结果是作为处理程序添加到PostCompleted

因此,它是写一个更简洁的方式:这是一个速记

app.PostCompleted += delegate(object o, EventArgs args) 
{ 
    // ... 
}; 

void YourHandler(object o, EventArgs args) 
{ 
    // ... 
} 

// ... 

app.PostCompleted += YourHandler; 
+8

这就是'app.PostCompleted + = new EventHandler(YourHandler)'的简写本身;'。 – Shibumi

+0

你甚至不需要有“新的EventHandler”。 C#编译器足够聪明,可以推断出使用哪个委托。所以更短的快捷方式是'app.PostCompleted + = YourHandler;' – Sung

+4

@Sung我想这正是他所说的。 –

8

这是使用lambda表达式为PostCompleted事件添加的处理程序。它类似于

app.PostCompleted += MyHandler; 

    // ... 

    private void MyHandler(object sender, EventArgs e) { 
     // ... 
    } 

但是,当使用lambda表达式时,不能轻松地分离处理程序。

5

这是用于定义POST完成事件的事件处理程序委托速记:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ... 
}; 

另请参阅Anonymous Methods

3

假设PostCompleted是一个事件,你基本上使用lambda表示法创建一个事件处理程序。

此代码剪断等效于:

app.PostCompleted += delegate (o, args) 
{ 
    if (args.Error == null) 
    { 
     MessageBox.Show("Picture posted to wall successfully."); 
    } 
    else 
    { 
     MessageBox.Show(args.Error.Message); 
    } 
}; 
2

(o,args) =>部分是lambda expression,这是一个匿名函数。

+=部分分配要在事件触发时调用的lambda表达式。

+0

Thnaks为MSDN链接..... –

3

的vb.net相当于是这样的:

AddHandler app.PostCompleted, Function(o, args) 
     ''# ... 
    End Function 

注意,这需要的Visual Studio 2010/.NET 4,但C#代码工作早在Visual Studio 2008中/ .NET 3.5。

但这只是部分正确。在C#中,这是一种将方法定义为事件处理程序的方法。在VB中。净,您可以使用关键字Handles,因此实际相当于看起来更像是这样的:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted 
    ''# 
End Sub 

但是,即使这不是完全等同的,因为你给的方法的名称,可以从任何地方调用它。对C#代码的唯一引用(并因此是调用它的唯一方式)是通过事件订阅。