什么是+ =(o,arg)=>实际上实现?

时间:2011-07-26 18:36:48

标签: c#

很抱歉要问所有人,但我是一个老手Vb.net的人正在转移到c#。我有以下代码片段似乎在触发postAsync方法(在本例中)时激活。我只是不明白代码在做什么(如下所示): -

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

如果有人能解释什么+ =(o,args)=>实际上,我会变得非常好......

非常感谢提前。 添

6 个答案:

答案 0 :(得分:27)

(o,args) =>定义了一个lambda表达式,它带有两个名为oargs的参数。根据{{​​1}}的类型推断出这些参数的类型(如果PostCompletedPostCompleted,那么它们将分别为EventHandlerObject类型)。表达式的主体紧跟在EventArgs之后。

结果将作为处理程序添加到=>

因此,这是一种不那么冗长的写作方式:

PostCompleted

以下是:

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

答案 1 :(得分:8)

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

  app.PostCompleted += MyHandler;

  // ...

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

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

答案 2 :(得分:5)

它是为POST完成事件定义事件处理程序的委托的简写:

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

另见Anonymous Methods

答案 3 :(得分: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);
    }
};

答案 4 :(得分: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.Net中,您可以使用Handles关键字,因此实际的等价可能看起来更像是这样:

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

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

答案 5 :(得分:2)

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

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