代码之家  ›  专栏  ›  技术社区  ›  dannylindquist

c#-传递匿名函数而不是连接事件

  •  3
  • dannylindquist  · 技术社区  · 8 年前

    我最近发现了Actions和匿名函数的用法,以及它们在处理任务时是如何方便的。我做了一些测试,将匿名函数传递到类中,以类似于事件。

    我所做的一个例子是。。。

    var myForm = new MyForm();
    myForm.OnCertainEvent(output => {
        //interact with UI based on feedback.
    }));
    

    然后在表单本身中,我将设置一个Action属性,并将Action传递到 OnCertainEvent 方法

    我认为这种语法非常简洁,而不是声明事件、委托并将它们与 += 语法。

    这会是一种糟糕的做法吗?显然这不是传统的,但它有什么负面影响吗?本质上,我只是提供一个回调。

    3 回复  |  直到 8 年前
        1
  •  2
  •   David Pine Domenic    8 年前

    这会是一种糟糕的做法吗?

    这是一个非常重要的问题。这实际上取决于几个关键因素,如:

    • 你想在哪里使用 Action , Action<T> 代表
    • 对于实际处理事件的类,您是否正确地不知道事件处理程序?
    • 你是在指挥 行动 动作<T> 委托回调作为事件处理程序?

    似乎您正在尝试将回调分配为事件处理程序,但您实现它的方式似乎不正确。您似乎正在尝试通过一个方法注册回调,即 OnCertainEvent 缺陷在于,消费者可能会多次调用该函数,最终执行的次数与调用的回调次数相同,这有意义吗?

    事件是多播的,这意味着您可以连接无限多个处理程序,以在单个事件上作为回调进行侦听 event 它被发射。下面是我所说的一个例子,我写了一个 .NET Fiddle 。这样写永远无法取消订阅听众,因为他们是匿名的,这可能会导致问题。

    显然这不是传统的,但它有什么负面影响吗?

    只要你意识到了后果,并且正确地清理了你的代码,那就没问题了。在您想要处理这样的事件的情况下,您可以通过使用类的构造函数(在您的特定情况下 MyForm ). 这是另一个 .NET Fiddle 以证明这一点。

    这是完全可能的,而且超级强大,在我看来现在被认为是“传统的”。创建自己的想法 delegate 自从泛型和 lambda expressions 。最后一个链接是一个无耻的插头,我希望所有这些都有意义,并回答了你的问题!

        2
  •  0
  •   Gusman    8 年前

    自从C#中的lambdas以来,它是一个非常常用的模式,但也有它的优点和缺点。

    不便之处在于,只有一个“接收者”可以成为目标,通过一个事件,您可以根据自己的需要挂接任意多个接收者。

    优点是,很容易编写fire and forget类型表达式,而不是与事件挂钩。

    如果您想探索关于如何相互通信不同类的更多构造,请查看委托模式,而不是.net委托,而是公开可能调用的函数的接口,就像在Java中一样。

        3
  •  0
  •   user1385417    8 年前

    不,这完全可以。如果你想观察自己,我会将传递的方法限制为几行。实际上,这取决于你想在方法中做什么。如果你在做抽象上与主方法分离的事情,那么最好把它作为一个独立的方法。如果只是一个简单的更改或更新之类的,我认为内嵌代码更优雅。

    但是,要小心使用方法范围之外的本地数据。这是合法的,但如果你遇到问题,很有可能就是问题所在。