我有一个类来处理WinForms控件的事件。根据用户的操作,我正在解除引用该类的一个实例并创建一个新的实例来处理同一事件。我需要先从事件中退订旧的实例 - 这很容易实现。如果可能的话,我想以非专有方式实现这一点,似乎这是IDisposable的工作。然而,大多数文档只建议在使用非托管资源时才使用IDisposable,这里并不适用。
如果我在Dispose()中实现IDisposable并从事件中取消订阅,那么我是否在滥用它的意图?我应该提供一个Unsubscribe()函数并调用它吗?
编辑:这是一些虚拟代码,展示了我的做法(使用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的答案,至少目前是这样。我认为使用熟悉的接口的好处超过在没有未管理的代码参与时使用它可能存在的任何缺点(这个对象的用户甚至怎么知道?)。
如果有人持不同意见,请发表/评论/编辑。如果可以提出更好的反对IDisposable的论点,那我会改变接受的答案。