我有一个处理来自 WinForms 控件的事件的类。根据用户正在做的事情,我正在推迟该类的一个实例并创建一个新实例来处理相同的事件。我需要先从事件中取消订阅旧实例 - 很简单。如果可能的话,我想以非专有的方式来做这件事,这似乎是 IDisposable 的工作。但是,大多数文档仅在使用非托管资源时才建议使用 IDisposable,这在此处不适用。
如果我实现 IDisposable 并取消订阅 Dispose() 中的事件,我是否会歪曲它的意图?我应该提供一个 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 提出更好的论据,那么我将更改已接受的答案。