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

15

很抱歉要问这个问题,但我是一个熟悉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) => 实际上实现了什么,我将不胜感激...

提前致谢。 Tim

6个回答

27

(o,args) => 定义了一个 lambda 表达式,该表达式接受名为 oargs 的两个参数。根据 PostCompleted 的类型推断出这些参数的类型(如果 PostCompleted 是一个 EventHandler,则它们分别将是 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
你甚至不需要使用 "new EventHandler"。C#编译器足够智能,可以推断出要使用哪个委托。因此,一个更短的快捷方式是 app.PostCompleted += YourHandler; - dance2die
4
@Sung 我认为这正是他所说的内容。 - Etienne de Martel

8

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

  app.PostCompleted += MyHandler;

  // ...

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

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


5
这是一个代理的简写,用于定义POST完成事件的事件处理程序:
app.PostCompleted += delegate(object o, EventArgs args) { 
    // ...
};

参见匿名方法.


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);
    }
};

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


2

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

+= 部分将lambda表达式分配为事件触发时要调用的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接