プロパティセッターを使用して、フィールドの値が変更されるたびにイベントを発生させることができます。
独自のEventHandlerデリゲートを持つことも、有名なSystem.EventHandlerデリゲートを使用することもできます。
通常、これにはパターンがあります。
- イベントハンドラデリゲート(EventArgs型の引数を持つ)を使用してパブリックイベントを定義します。
- OnXXXXX(OnMyPropertyValueChangedなど)と呼ばれる保護された仮想メソッドを定義します。このメソッドでは、イベントハンドラーデリゲートがnullであるかどうかを確認し、そうでない場合はそれを呼び出すことができます(つまり、イベントデリゲートに1つ以上のメソッドがアタッチされていることを意味します)。
- 何かが変更されたことをサブスクライバーに通知する場合は常に、この保護されたメソッドを呼び出します。
ここに例があります
private int _age;
//#1
public event System.EventHandler AgeChanged;
//#2
protected virtual void OnAgeChanged()
{
if (AgeChanged != null) AgeChanged(this,EventArgs.Empty);
}
public int Age
{
get
{
return _age;
}
set
{
//#3
_age=value;
OnAgeChanged();
}
}
このアプローチの利点は、クラスから継承したい他のクラスが必要に応じて動作を変更できるようにすることです。
発生している別のスレッドでイベントをキャッチする場合は、別のスレッドで定義されているオブジェクトの状態を変更しないように注意する必要があります。これにより、スレッド間例外がスローされます。これを回避するには、状態を変更するオブジェクトでInvokeメソッドを使用して、イベントが発生したスレッドと同じスレッドで変更が発生していることを確認するか、Windowsフォームを処理している場合にBackgourndWorkerを使用して、並列スレッドで素晴らしく簡単に処理を行うことができます。