+= (0, arg) =>真正实现

本文关键字:实现 arg | 更新日期: 2023-09-27 18:03:29

很抱歉问大家,但我是一个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);
        }
    };

如果有人能解释一下+= (0,args) =>实际上是什么,我会非常感激....

提前感谢。蒂姆。

+= (0, arg) =>真正实现

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

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

因此,这是一种更简洁的书写方式:
app.PostCompleted += delegate(object o, EventArgs args)
{
    // ...
};

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

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

  app.PostCompleted += MyHandler;
  // ...
  private void MyHandler(object sender, EventArgs e) {
      // ...
  }

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

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

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

参见匿名方法。

假设PostCompleted是一个事件,您基本上是使用lambda符号创建一个事件处理程序。

这段代码相当于:

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

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#代码的唯一引用(因此也是调用它的唯一方法)是通过事件订阅。

(o,args) =>部分是lambda表达式,是一个匿名函数。

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