参考ます。https://docs.microsoft.com/zh-cn/dotnet/standard/events/indexビュー= netframework-4.8?
タイトル:イベントの処理と上げます
.NETイベントは、委譲モデルをベース。 委任モデルは、以下のオブザーバーデザインパターンをその加入者がプロバイダに登録し、通知を受け取ることができますので、。 イベント通知の送信者のプッシュイベントは、イベントの受信機が通知を受信して、その定義に応じて、発生します。 この記事では、アプリケーションとどのようにあなたのコード内のイベントを実装するには、イベントを使用する方法、委任モデルの主要コンポーネントについて説明します。
Windowsの8.xのストアアプリでのイベント処理の詳細については、参照イベントとルーティングイベントの概要を。
アクティビティ
イベントは、送信対象の操作信号によって送信されたメッセージです。 この操作は、ボタンのクリックなど、ユーザ相互作用によって引き起こされてもよい。また、属性値の変更など、いくつかの他のロジックプログラムによって引き起こされ得ます。 イベントを発生させるオブジェクトは、「イベントの送信者」と呼ばれています。 イベントの送信者は、それが原因となったイベント(プロセス)を受け取りますどのオブジェクトやメソッドを知りません。 イベントは、例えば、通常、イベントの送信元のメンバーで クリック イベントをされた ボタン 、クラスメンバーのPropertyChanged イベントを達成することです INotifyPropertyChangedの インターフェイスクラスのメンバーを。
イベントを定義するには、イベントクラスの署名に使用することができます event
(C#の場合)または Event
キーワード(Visual Basicでは)を、そしてイベントのデリゲート型を指定します。 次のセクションで委託。
一般的に、昇給のイベントに、あなたはC#でマークを追加することができます protected
し、 virtual
またはのためのVisual Basicの中の標識 Protected
と Overridable
する方法。 このメソッドは、指定され On
EVENTNAME ; OnDataReceived
例えば、。 このメソッドは、指定されたイベント・データ・オブジェクトを受信すべき(のEventArgs 型または派生型のパラメータ)です。 あなたは、このメソッドは派生クラスでイベントを発射ロジックを上書きすることができます提供しています。 派生クラスは常に基本クラスを呼び出す必要があり On
EVENTNAMEの 登録されているデリゲートがイベントを受け取ることを保証する方法を。
名前の宣言方法を次の例が示す ThresholdReached
イベントを。 イベント のEventHandler 仲間との委託 OnThresholdReached
開始の方法。
クラスカウンター { 公共の イベントのEventHandler ThresholdReached。 保護された 仮想 ボイドOnThresholdReached(のEventArgs電子) { イベントハンドラハンドラ = ThresholdReached。 ハンドラ .Invoke(?この、E); } // クラスの残りの実装を提供 }
委ねます
デリゲートは、保存された参照方法の一種です。 デリゲートは、戻り値の型とパラメータの署名文を表示させる方法によって参照され、その署名が基準法に合致するだけで保存することができます。 したがって、委員会は、タイプセーフ関数ポインタまたはコールバックに相当します。 デリゲートの宣言は、デリゲート型を定義するのに十分です。
委員会は、.NETで、多くの用途があります。 イベントのコンテキストでは、イベントはソースとコードの間の仲介委任処理するイベント(または類似のポインタ機構)。 一例として、関連するイベントタイプにイベントとデリゲートは、デリゲート宣言缶を含みます。 委任の詳細については、 デリゲート クラスを。
.NETが提供 のEventHandler と のEventHandler <TEventArgs> イベントシーンのほとんどをサポートするための委託を。 使用 のEventHandler すべてのイベントがイベント・データが含まれていない処理するためのデリゲート。 使用 のEventHandler <TEventArgs> デリゲートハンドルイベントには、イベント関連のデータが含まれます。 デリゲートは、型を返すと、二つのパラメータ(ターゲット・イベント・ソース・データ・オブジェクトおよびイベント)を取りません。
代表団は、マルチキャスト、彼らは複数のイベントのための参照処理を節約することができることを意味しています。 詳細については、 委任の リファレンスページを。 イベント処理の柔軟性と正確な制御を提供するために、受託。 登録されたイベントハンドラのリストの主なイベントを維持することによってイベントを発生させたディスパッチャイベントの一種として機能します。
EventHandler と のEventHandler <TEventArgs> シーンが使用不能に委託し、あなたは、デリゲートを定義することができます。 デリゲートのシーンを定義する必要がありますあなたはコードが一般的な認識されないときに対処しなければならないとき、例えば、非常にまれです。 声明の中で使用 delegate
し、(C#の場合) Delegate
(Visual Basicでは)委託キーワードタグ。 宣言する方法を次の例が示す ThresholdReachedEventHandler
デリゲートを。
パブリック デリゲート 無効 ThresholdReachedEventHandler(オブジェクト送信者、ThresholdReachedEventArgs E)。
イベントデータ
イベントに関連付けられたデータは、イベントデータクラスによって提供することができます。 .NETは、イベントデータクラスの数を提供し、独自のアプリケーションでそれらを使用することができます。 例えば、SerialDataReceivedEventArgs クラスがある SerialPort.DataReceived イベントデータクラスのイベント。 すべてのイベントデータクラスに続く.NET EventArgs
命名体系の終わり。 イベントに関連するイベント・データ・クラスがイベントを表示するために委員会によって決定されます。 例えば、SerialDataReceivedEventHandlerの デリゲートであっ SerialDataReceivedEventArgs そのパラメータの1つとしてクラスを。
EventArgs クラスは、すべてのイベントデータクラスの基本型です。 イベントは、それに関連するすべてのデータを持っていないときは、使用します のEventArgsの クラスを。 あなたが他のクラスの問題を通知するためにのみ、イベントを作成するときは、を含め、すべてのデータを渡す必要はありません にEventArgsの 二番目のパラメータでデリゲートとしてクラス。 データが提供されていない場合は、あなたが渡すことができ EventArgs.Emptyの 値を。 EventHandlerの 備えデリゲート にEventArgsの パラメータとしてクラスを。
カスタムイベントデータクラスを作成したい場合は、から派生するクラスを作成して いるEventArgsの クラスは、すべてのメンバーがイベントに関連するデータを転送するために必要な。 一般的に、.NETは同じ命名規則を使用して、イベントデータクラス名は必要があります EventArgs
終了します。
次の例では、という名前を示す ThresholdReachedEventArgs
イベントデータクラスを。 これは、トリガイベントに属性の特定が含まれています。
パブリック クラスThresholdReachedEventArgs:EventArgsの { 公共の int型のしきい値は{ 取得します。セット; } 公共のDateTime TimeReached { 得ます。セット; } }
イベントハンドラ
イベントに応答するには、イベントシンクのイベントハンドラメソッドを定義する必要があります。 この方法では、処理されている、あなたのデリゲート署名のイベントと一致する必要があります。 イベントにイベントが発生したハンドラは、ユーザがボタンをクリックした後、ユーザー入力を収集するように、所望の動作を実行します。 イベントが発生したときに通知を受け取った場合、あなたのイベントハンドラメソッドは、イベントをサブスクライブする必要があります。
次の例は、 c_ThresholdReached
署名がデリゲートと一致する イベントハンドラの イベントハンドラメソッドを。 メソッドのサブスクリプション ThresholdReached
イベント。
クラスプログラム { 静的な 無効メイン() { VARの C = 新しいカウンタ(); c.ThresholdReached + = c_ThresholdReached。 //は、クラスの実装残り提供 } 静的 ボイド c_ThresholdReached(オブジェクト送信者、のEventArgs eを) { Console.WriteLineを(「しきい値に達しました。」)。 } }
静的および動的なイベントハンドラ
.NETでは、加入者は、イベント通知を取得するには、静的または動的登録することができます。 静的なイベントハンドラ、そのライフサイクル全体のために、まだ有効なイベントハンドラによって処理するためのクラスイベントのために。 通常、いくつかのプログラム・ロジックの条件に応じて、プログラムの実行時に動的に明示的に有効にし、deactivateイベントハンドラです。 例えば、イベント通知は、特定の条件下でのみ必要な場合、またはアプリケーションがイベントハンドラを複数提供する場合、イベントハンドラは、使用する適切に定義された条件を実行し、動的イベントハンドラを使用することができます。 例の一つで動的にイベントハンドラを追加する方法を示します。 詳細については、Visual Basicの中を見るイベントとC#の中でのイベント。
複数のイベントを開始
あなたのクラスは複数のイベントを発生させた場合、コンパイラはフィールドを生成する各イベントインスタンスのために委託されます。 多数のイベント場合は、デリゲートのストレージコストで計算フィールドを受け入れることができない場合があります。 このような場合のために、.NETは、イベント属性を提供し、それが一緒に保存された選択されたイベントデリゲートのための別のデータ構造であってもよいです。
イベントプロパティは、イベントとイベントアクセスコンポーネントによって宣言されました。 イベントアクセサメソッドは、イベントのデリゲートのインスタンスからのストレージおよび除去を追加するために使用されるデータ構造を定義します。 注意してくださいそれよりイベントフィールドイベントプロパティ遅く、それはそれを呼び出す前に、各イベントのデリゲートを取得する必要があるため。 これは、速度とメモリの間のトレードオフが必要でした。 クラスが頻繁にトリガされたイベントの数を定義した場合、我々はイベントの属性を実装する必要があります。 詳細については、イベント属性が複数のイベントを処理するために使用:どのように。