J'ai une classe qui gère les événements d'un contrôle WinForms. En fonction de ce que fait l'utilisateur, je déferre une instance de la classe et en crée une nouvelle pour gérer le même événement. Je dois d'abord désinscrire l'ancienne instance de l'événement - assez facile. J'aimerais faire cela d'une manière non propriétaire si possible, et il semble que ce soit un travail pour IDisposable. Cependant, la plupart des documents recommandent l'utilisation d'IDisposable uniquement en cas d'utilisation de ressources non gérées, ce qui n'est pas le cas ici.
Si j'implémente IDisposable et que je me désinscris de l'événement dans Dispose(), est-ce que je pervertis son intention ? Devrais-je plutôt fournir une fonction Unsubscribe() et l'appeler ?
Editar: Voici un code fictif qui montre un peu ce que je fais (en utilisant IDisposable). Mon implémentation réelle est liée à une liaison de données propriétaire (longue histoire).
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);
}
}
Dans le code réel, la classe "EventListener" est plus impliquée, et chaque instance a une signification unique. Je les utilise dans une collection, et les crée/détruit au fur et à mesure que l'utilisateur clique.
Conclusion
J'accepte La réponse de gbjbaanb du moins pour l'instant. J'ai le sentiment que l'avantage d'utiliser une interface familière l'emporte sur les inconvénients éventuels de son utilisation lorsqu'aucun code non géré n'est impliqué (comment un utilisateur de cet objet pourrait-il même le savoir ?).
Si quelqu'un n'est pas d'accord - merci de poster/commenter/modifier. Si un meilleur argument peut être avancé contre IDisposable, alors je changerai la réponse acceptée.