代码之家  ›  专栏  ›  技术社区  ›  Jimmy Hoffa

方法订阅与lambda委托订阅-哪种和为什么?

  •  5
  • Jimmy Hoffa  · 技术社区  · 14 年前

    我见过一些人倾向于将方法交给回调/事件,有时只交给lambdas。

    你们能概述一下两者之间的区别吗,如果有的话,以及当两者都可用时,你们在两者之间选择的规则吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   JaredPar    14 年前

    两者最大的区别之一是你可以轻松地取消订阅活动。用基于方法的方法退订是一个简单的操作,简单的使用原来的方法

    m_button.Click += OnButtonClick; 
    ...
    m_button.Click -= OnButtonClick;
    

    对于lambdas,这并不是那么简单。必须存储lambda表达式,以便稍后用于取消对事件的订阅

    m_button.Click += delegate { Console.Write("here"); }
    ...
    // Fail
    m_button.Click -= delegate { Console.Write("here"); } 
    
    EventHandler del = delegate { Console.Write("here"); }
    m_button.Click += del;
    ...
    m_button.Click -= del;
    

    这确实有损于使用lambda表达式的便利性。

        2
  •  2
  •   cHao Hammerite    14 年前

    在大多数具有lambda(包括C#)的语言中,在方法中创建lambda会创建闭包——也就是说,声明方法中的局部变量对lambda是可见的。这是我所知道的最大的不同。

    除此之外,除非以其他函数可以访问的方式命名事件处理程序,否则以后很难分离事件处理程序。这可以通过将委托存储在实例级或类级变量中来实现,但这可能有点难看。

        3
  •  1
  •   James King    14 年前

    使用Lambda的最大原因是延迟执行,即定义要执行的操作,但直到稍后才有参数。对于事件和回调,通常不使用lambda;而是使用匿名方法。

    一般来说,我对回调和事件使用的实际方法多于匿名方法;我处理的事件与对象的生存期有关,而不是与方法的生存期有关,我发现在代码中,在连接回调的函数外部明确定义回调更为清晰。其中一些是个人喜好。

        4
  •  0
  •   Community taleinat    7 年前

    在大多数情况下,实际差别不大。使用哪一个主要取决于个人喜好(即您希望代码使用什么) 例如)。在某些情况下,有一些实际的理由选择其中一个:

    1. 如中所述 the accepted answer ,取消订阅匿名方法比取消订阅命名方法更复杂。如果没有名称,就无法引用匿名方法,除非由在运行时创建的委托实例声明匿名方法。使用命名方法,可以取消订阅委托,而无需保留对原始委托(或其等效对象)的引用。

    在这种特殊情况下