方法 : クラスにイベントを実装する
更新 : 2007 年 11 月
以下の手順では、クラスにイベントを実装する方法について説明します。最初の手順では、関連付けられたデータを持たないイベントを実装します。このイベントは、イベント データとして System.EventArgs クラスを使用し、デリゲート ハンドラとして System.EventHandler クラスを使用します。2 番目の手順では、カスタム データを持つイベントを実装します。このイベントは、イベント データおよびイベント ハンドラのカスタム クラスを定義します。
イベントの発生と処理を説明する詳細なサンプルについては、「方法 : イベントを発生させる/処理する」を参照してください。
イベント固有のデータを持たないイベントを実装するには
クラスにパブリック イベント メンバを定義します。イベント メンバの型に System.EventHandler デリゲートを設定します。
public class Countdown { ... public event EventHandler CountdownCompleted; }
Public Class Countdown ... Public Event CountdownCompleted As EventHandler End Class
イベントを発生させるクラスにプロテクト メソッドを提供します。メソッドに OnEventName という名前を付けます。このメソッド内で対象のイベントを発生させます。
public class Countdown { ... public event EventHandler CountdownCompleted; protected virtual void OnCountdownCompleted(EventArgs e) { if (CountdownCompleted != null) CountdownCompleted(this, e); } }
Public Class Countdown ... Public Event CountdownCompleted As EventHandler Protected Overridable Sub OnCountdownCompleted(e As EventArgs) RaiseEvent CountdownCompleted(Me, e) End Sub End Class
クラスでいつイベントを発生させるかを決定します。OnEventName を呼び出して、イベントを発生させます。
public class Countdown { ... public void Decrement { internalCounter = internalCounter - 1; if (internalCounter == 0) OnCountdownCompleted(new EventArgs()); } }
Public Class Countdown ... Public Function Decrement InternalCounter = internalCounter - 1 If internalCounter = 0 OnCountdownComplete(New EventArgs()) End If End Function End Class
イベント固有のデータを持つイベントを実装するには
イベントのデータを提供するクラスを定義します。クラスに EventNameArgs という名前を付け、System.EventArgs からこのクラスを派生させ、イベント固有のメンバを追加します。
public class AlarmEventArgs : EventArgs { private readonly int nrings = 0; private readonly bool snoozePressed = false; //Constructor. public AlarmEventArgs(bool snoozePressed, int nrings) { this.snoozePressed = snoozePressed; this.nrings = nrings; } //Properties. public string AlarmText { ... } public int NumRings { ... } public bool SnoozePressed{ ... } }
Public Class AlarmEventArgs Inherits EventArgs Private nrings As Integer = 0 Private _snoozePressed As Boolean = False 'Constructor. Public Sub New(ByVal snoozePressed As Boolean, ByVal nrings As Integer) Me.snoozePressed = snoozePressed Me.nrings = nrings End Sub 'Properties. Public ReadOnly Property AlarmText() As String ... End Property Public ReadOnly Property NumRings() As Integer ... End Property Public ReadOnly Property SnoozePressed() As Boolean ... End Property End Class
イベントのデリゲートを宣言します。デリゲートに EventNameEventHandler という名前を付けます。
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
クラスに EventName という名前のパブリック イベント メンバを定義します。イベント メンバの型にイベント デリゲート型を設定します。
public class AlarmClock { ... public event AlarmEventHandler Alarm; }
Public Class AlarmClock ... Public Event Alarm As AlarmEventHandler End Class
イベントを発生させるクラスにプロテクト メソッドを定義します。メソッドに OnEventName という名前を付けます。このメソッド内で対象のイベントを発生させます。
public class AlarmClock { ... public event AlarmHandler Alarm; protected virtual void OnAlarm(AlarmEventArgs e) { if (Alarm != null) Alarm(this, e); } }
Public Class AlarmClock ... Public Event Alarm As AlarmEventHandler Protected Overridable Sub OnAlarm(e As AlarmEventArgs) RaiseEvent Alarm(Me, e) End Sub End Class
クラスでいつイベントを発生させるかを決定します。OnEventName を呼び出してイベントを発生させ、EventNameEventArgs を使用してイベント固有のデータを渡します。
Public Class AlarmClock { ... public void Start() { ... System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(false, 0); OnAlarm(e); } }
Public Class AlarmClock ... Public Function Start ... System.Threading.Thread.Sleep(300) Dim e As AlarmEventArgs = New AlarmEventArgs(False, 0) OnAlarm(e) End Function End Class