【问题标题】:Usage of += operator with lambda operator [duplicate]+= 运算符与 lambda 运算符的用法
【发布时间】:2017-11-14 18:21:50
【问题描述】:

我有以下代码:

recognizer = new GestureRecognizer();
recognizer.Tapped += (args) =>
{
    // Send an OnSelect message to the focused object and its ancestors.
    if (FocusedObject != null)
    {
        FocusedObject.SendMessageUpwards("OnSelect", 
            SendMessageOptions.DontRequireReceiver);
    }
};

我在 Unity 的一个项目中工作,我对这个操作的语法不是很熟悉:

recognizer.Tapped += (args) =>
{
    // Send an OnSelect message to the focused object and its ancestors.
    if (FocusedObject != null)
    {
        FocusedObject.SendMessageUpwards("OnSelect", 
            SendMessageOptions.DontRequireReceiver);
    }

我了解Tapped 是点击的事件监听器。但是,我不明白以下几点:

1) 为什么他们使用+= 运算符来添加 lambda 函数。如何添加这样的 lambda 函数?我一直在原始类型上使用+=

2) “args”从何而来?

3) 那个 lambda 函数什么时候运行?

【问题讨论】:

  • 这不是添加 lambda 函数。 += 是添加事件侦听器的语法。只要 lambda 接受事件的参数,它就可以成为事件侦听器
  • @PanagiotisKanavos 被窃听了一个数组? += 运算符如何允许这样做?所以它正在添加一个函数来充当事件监听器。
  • 这是一个事件,而不是一个数组。 += 是用于向事件添加事件侦听器的语法。 It's explained in the docs。这也不是新语法,我认为这是从 .NET 1.0 开始可用的
  • 值得注意的是,您混合了两个概念。第一个是事件注册,第二个是 lambda 表达式。事件订阅 lambda 表达式不是必需的,您可以轻松地提供签名与预期匹配的方法的名称,在这种特定情况下,它是一个 void 方法,它接受单个参数。
  • @Pablo - 以下任何答案是否有助于您解决问题?

标签: c# lambda


【解决方案1】:

他们为什么要使用 += 运算符来添加 lambda 函数?

这里的重点是不是 lambda 方法,而是事件 并向其注册委托。它overrloads+= 运算符订阅更多​​事件监听器。 Tapped 属性是一个事件(请参阅下面的链接)。

来自+= 运算符的文档:

+= 运算符还用于指定响应事件而调用的方法;此类方法称为事件处理程序。在此上下文中使用 += 运算符称为订阅事件。

“args”从何而来?

当事件触发时,它会通过一个参数触发(在 Tapped 定义的这种特定情况下。当它触发时,它会将此参数传递给所有事件侦听器。

那个 lambda 函数什么时候运行?

每当触发事件并导致调用所有侦听器时。其中之一就是这个 lambda 方法。


我建议看看:How to: Subscribe to and Unsubscribe from Events 以及更多关于events的一般信息

还可以查看 MSDN 上的 Delegates and Events+= operator with Events

【讨论】:

    【解决方案2】:

    基本上,它是一个 lambda 事件监听器。而不是将其定义为如下函数:

    function void myEvent(object o, EventArgs args){}; recognizer.Tapped += myEvent;

    它是在同一个地方定义和分配的。

    使用 += 的原因是因为您可以将多个事件处理程序分配给同一个事件,如下所示:

    function void myEvent(object o, EventArgs args){};
    function void yourEvent(object o, EventArgs args){};
    recognizer.Tapped += myEvent;
    recognizer.Tapped += yourEvent;
    

    如果你想删除分配的事件,你可以像这样使用 -=:

    recognizer.Tapped -= myEvent;

    参数是所有事件都需要的事件处理程序定义的一部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 2011-04-20
      • 2017-03-29
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多