У меня есть класс, который обрабатывает события из элемента управления 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 answer, по крайней мере пока. Я чувствую, что преимущество использования знакомого интерфейса перевешивает любой возможный недостаток использования его там, где не задействован неуправляемый код (как мог бы пользователь этого объекта даже знать это?).
Если кто-то не согласен - пожалуйста, публикуйте/комментируйте/редактируйте. Если лучший аргумент можно сделать против IDisposable, я изменю принятый ответ.