イベントに関する Vilx の発言に同意し、それに対処するのに役立つ設計パターンを推奨したいと思います。
たとえば、イベント ソースである型があるとします。
interface IEventSource
{
event EventHandler SomethingHappened;
}
そのタイプのインスタンスからのイベントを処理するクラスのスニペットを次に示します。プロパティに新しいインスタンスを割り当てるときはいつでも、最初に以前の割り当てからサブスクライブを解除してから、新しいインスタンスをサブスクライブするという考え方です。null チェックにより、正しい境界の動作が保証され、さらに重要なことに、破棄が単純化されます。プロパティを null にするだけです。
それは処分のポイントをもたらします。イベントはマネージ リソースであるため、イベントをサブスクライブするすべてのクラスは IDisposable インターフェイスを実装する必要があります。(注: 簡潔にするために、この例では Dispose パターンの適切な実装を省略しましたが、おわかりいただけると思います。)
class MyClass : IDisposable
{
IEventSource m_EventSource;
public IEventSource EventSource
{
get { return m_EventSource; }
set
{
if( null != m_EventSource )
{
m_EventSource -= HandleSomethingHappened;
}
m_EventSource = value;
if( null != m_EventSource )
{
m_EventSource += HandleSomethingHappened;
}
}
}
public Dispose()
{
EventSource = null;
}
// ...
}