WinForms コントロールからのイベントを処理するクラスがあります。ユーザーが何をしているかに基づいて、クラスの 1 つのインスタンスを参照し、同じイベントを処理するために新しいインスタンスを作成しています。最初にイベントから古いインスタンスのサブスクライブを解除する必要があります - 簡単です。できれば非独占的な方法でこれを行いたいのですが、これは 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 に対してより良い議論ができる場合は、受け入れられた答えを変更します。