我有一个处理来自 WinForms 控件的事件的类。根据用户正在执行的操作,我引用该类的一个实例并创建一个新实例来处理同一事件。我需要首先从事件中取消订阅旧实例 - 很简单。如果可能的话,我想以非专有的方式执行此操作,这似乎是 IDisposable 的工作。但是,大多数文档仅在使用非托管资源时建议使用 IDisposable,但这并不适用于此。
如果我实现 IDisposable 并在 Dispose() 中取消订阅事件,我是否会歪曲其意图?我应该提供一个 Unsubscribe() 函数并调用它吗?
Edit:这是一些虚拟代码,显示了我正在做的事情(使用 IDisposable)。我的实际实现与一些专有数据绑定有关(长话短说)。
class EventListener : IDisposable
{
private TextBox m_textBox;
public EventListener(TextBox textBox)
{
m_textBox = textBox;
textBox.TextChanged += new EventHandler(textBox_TextChanged);
}
void textBox_TextChanged(object sender, EventArgs e)
{
// do something
}
public void Dispose()
{
m_textBox.TextChanged -= new EventHandler(textBox_TextChanged);
}
}
class MyClass
{
EventListener m_eventListener = null;
TextBox m_textBox = new TextBox();
void SetEventListener()
{
if (m_eventListener != null) m_eventListener.Dispose();
m_eventListener = new EventListener(m_textBox);
}
}
在实际代码中,“EventListener”类涉及的比较多,并且每个实例都有唯一的意义。我在集合中使用它们,并在用户单击时创建/销毁它们。
结论
我接受gbjbaanb 的回答 https://stackoverflow.com/questions/452281/using-idisposable-to-unsubscribe-events#452321, 最起码到现在。我认为使用熟悉的界面的好处超过了在不涉及非托管代码的情况下使用它的任何可能的缺点(该对象的用户如何知道这一点?)。
如果有人不同意 - 请发布/评论/编辑。如果可以对 IDisposable 提出更好的论据,那么我将更改已接受的答案。
是的,去做吧。尽管有些人认为 IDisposable 仅针对非托管资源实现,但事实并非如此 - 非托管资源恰好是最大的胜利,也是实现它的最明显的原因。我认为它之所以获得这个想法是因为人们想不出任何其他理由来使用它。它不像终结器,终结器是一个性能问题,而且 GC 不容易处理好。
将所有整理代码放入您的 dispose 方法中。与试图记住撤消引用相比,它会更清晰、更干净,并且更容易防止内存泄漏,而且更容易正确使用。
IDisposable 的目的是让您的代码更好地工作,而无需您做大量的手动工作。利用它的力量对你有利,克服一些人为的“设计意图”废话。
我记得当 .NET 首次问世时,说服 Microsoft 确定性终结的有用性是非常困难的 - 我们赢得了这场战斗并说服他们添加它(即使当时它只是一种设计模式),使用它!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)