C# のイベント宣言の恐ろしさはよく知られています。スレッドセーフを確保するために、標準では次のように記述します。
public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e)
{
var handler = SomethingHappened;
if (handler != null)
handler(this, e);
}
最近、このボードの他の質問 (今は見つかりません) で、このシナリオでは拡張メソッドをうまく使用できると誰かが指摘しました。これを行う1つの方法は次のとおりです。
static public class EventExtensions
{
static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
{
var handler = @event;
if (handler != null)
handler(sender, e);
}
static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
where T : EventArgs
{
var handler = @event;
if (handler != null)
handler(sender, e);
}
}
これらの拡張メソッドを配置すると、イベントを宣言して発生させるために必要なのは、次のようなものだけです。
public event EventHandler SomethingHappened;
void SomeMethod()
{
this.SomethingHappened.RaiseEvent(this, EventArgs.Empty);
}
私の質問: これは良い考えですか? 標準の On メソッドがないことで何か不足しているのでしょうか? (私が気づいたことの 1 つは、明示的な追加/削除コードを持つイベントでは機能しないことです。)