У меня есть класс, который обрабатывает события из элемента управления 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 можно привести более веский аргумент, я изменю принятый ответ.