c# - 传递匿名函数而不是挂钩事件

时间:2016-03-17 17:02:55

标签: c# events anonymous-function

我最近发现了使用动作和匿名函数以及它们在处理任务时如何方便。我做了几个测试,将匿名函数传递给一个类,以便与事件类似地工作。

我正在做的事情的一个例子是......

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

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

我认为这种语法非常干净,而不是使用+=语法声明事件,委托和挂钩它们。

这是不好的做法吗?显然它不是传统的,但它有任何负面影响吗?基本上我只是提供一个回调。

3 个答案:

答案 0 :(得分:2)

  

这是不好的做法吗?

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

  • 您想要使用ActionAction<T>代表的目的是什么?
  • 您是否为实际处理事件的类正确地取消了事件处理程序?
  • 您是否指示将ActionAction<T>委托回调作为事件处理程序进行连接?

好像您正在尝试将回调分配为事件处理程序,但实现它的方式似乎不正确。看起来你试图通过一种方法OnCertainEvent来注册你的回调,缺点是消费者可以多次调用它,基本上你最终会得到与执行次数相同的执行次数。调用了回调 - 这有意义吗?

事件是多播的,这意味着你可以连接无数个处理程序,作为对被触发的event的回调进行监听。这是我正在谈论的一个例子,我写了一个快速的.NET Fiddle。这样写的方式永远不能取消订阅听众,因为他们是匿名的,这可能会导致问题。

  

显然它不是传统的,但它有任何负面影响吗?

只要您了解后果并且正确清理代码就应该没问题。在您想要处理此类事件的情况下,您可以通过使用类的构造函数(在特定情况下为MyForm)来更安全地执行此操作。这是另一个.NET Fiddle来证明这一点。

这是完全可能和超级强大的,在我看来现在被认为是“传统的”。创建自己的delegate实现的概念已经消失,自从引入泛型和lambda expressions以来就已经过去了。最后一个链接是一个无耻的插件,我希望所有这些都有意义并回答你的问题!

答案 1 :(得分:0)

这是一种非常常用的模式,因为它是C#中的lambdas,但它有它的优点和不便。

不方便只是一个接收者&#34;可以作为目标,你可以根据需要挂钩任意数量的接收器。

优点,很容易编写一个即发即弃类型的表达式,而不是挂钩事件。

如果你想探索更多关于如何互通不同类的结构,那么看看委托模式,而不是.net委托,但是接触那些公开所调用的函数的接口,就像在Java中完成的那样。

答案 2 :(得分:0)

不,这样做完全没问题。你想看看自己,我会把传递给的方法限制在几行之内。真的,这取决于你想在方法中做什么。如果你正在做与主方法抽象分开的事情,那么实际上将它作为一个独立的方法可能会更好。如果只是一个简单的更改或更新,或者我认为内联代码更优雅。

请注意使用方法范围之外的本地数据。这是合法的,但如果你遇到问题,很有可能就是这个问题。