我最近发现了使用动作和匿名函数以及它们在处理任务时如何方便。我做了几个测试,将匿名函数传递给一个类,以便与事件类似地工作。
我正在做的事情的一个例子是......
var myForm = new MyForm();
myForm.OnCertainEvent(output => {
//interact with UI based on feedback.
}));
然后在表单本身中,我将设置一个Action属性,并将Action传递给OnCertainEvent
方法。
我认为这种语法非常干净,而不是使用+=
语法声明事件,委托和挂钩它们。
这是不好的做法吗?显然它不是传统的,但它有任何负面影响吗?基本上我只是提供一个回调。
答案 0 :(得分:2)
这是不好的做法吗?
这是一个非常间接的问题。这实际上取决于几个关键因素,如:
好像您正在尝试将回调分配为事件处理程序,但实现它的方式似乎不正确。看起来你试图通过一种方法OnCertainEvent
来注册你的回调,缺点是消费者可以多次调用它,基本上你最终会得到与执行次数相同的执行次数。调用了回调 - 这有意义吗?
事件是多播的,这意味着你可以连接无数个处理程序,作为对被触发的event
的回调进行监听。这是我正在谈论的一个例子,我写了一个快速的.NET Fiddle。这样写的方式永远不能取消订阅听众,因为他们是匿名的,这可能会导致问题。
显然它不是传统的,但它有任何负面影响吗?
只要您了解后果并且正确清理代码就应该没问题。在您想要处理此类事件的情况下,您可以通过使用类的构造函数(在特定情况下为MyForm
)来更安全地执行此操作。这是另一个.NET Fiddle来证明这一点。
这是完全可能和超级强大的,在我看来现在被认为是“传统的”。创建自己的delegate
实现的概念已经消失,自从引入泛型和lambda expressions以来就已经过去了。最后一个链接是一个无耻的插件,我希望所有这些都有意义并回答你的问题!
答案 1 :(得分:0)
这是一种非常常用的模式,因为它是C#中的lambdas,但它有它的优点和不便。
不方便只是一个接收者"可以作为目标,你可以根据需要挂钩任意数量的接收器。
优点,很容易编写一个即发即弃类型的表达式,而不是挂钩事件。
如果你想探索更多关于如何互通不同类的结构,那么看看委托模式,而不是.net委托,但是接触那些公开所调用的函数的接口,就像在Java中完成的那样。
答案 2 :(得分:0)
不,这样做完全没问题。你想看看自己,我会把传递给的方法限制在几行之内。真的,这取决于你想在方法中做什么。如果你正在做与主方法抽象分开的事情,那么实际上将它作为一个独立的方法可能会更好。如果只是一个简单的更改或更新,或者我认为内联代码更优雅。
请注意使用方法范围之外的本地数据。这是合法的,但如果你遇到问题,很有可能就是这个问题。