【ブロガー】抗骨アバディーン[オリジナル] http://www.cnblogs.com/liqingwen/p/6060297.html
シーケンス
昨日、「C#の知識のレビュー-はじめにイベントは、」シンプルなイベントの定義および使用を紹介し、私たちは、「パブリッシュ-サブスクライブ」今日は基本的な使用でのコンソールを見て。
ディレクトリ
まず、リリースイベントは、.NETクラスライブラリに基づいて、
すべてのイベントは、.NETクラスライブラリに基づいている のEventHandler 次のように定義され、デリゲート:
パブリックデリゲート無効のEventHandler(オブジェクト送信者、EventArgsの電子)。
手動で入力するように試みることができる のEventHandlerを 定義する「F12」のジャンプを押し、:
.NET 2.0は、デリゲートのジェネリックバージョン、すなわち導入 のEventHandler <TEventArgs>を。
【注意】我々のイベントが任意のカスタムデリゲート型に基づいて定義することができますが、構築されたのEventHandler拡張することを使用することをお勧めしますけれども。
第二に、使用EventHandlerのモードリリースイベント
1.ここでのEventArgsのBCLで継承されたクラスを選択し、データは、トリガ・イベントの時点で送信することができます。
1クラスMyEventArgs:のEventArgs 2 { 3パブリック文字列メッセージ{得ます。プライベートセット; } 4 5公共MyEventArgs(ストリングメッセージ) 6 { 7メッセージ=メッセージ。 8} 9}
2.ここだ、それはのEventArgsを継承し、第2引数は自己MyEventArgsタイプの定義です。
無効MyEventHandler(オブジェクト送信者、MyEventArgs引数)を委任する。
3. イベントの宣言のいくつかの形式:
(1)何もカスタムのEventArgsクラスが存在しない場合は、直接、デフォルトで提供されるC#での非ジェネリックのEventHandlerデリゲートを使用することができます。
公共のイベントのEventHandler MyEvent。
(2)の非ジェネリック使用する場合 のEventHandler、およびカスタムメイド書き込むため のEventArgs 次のように派生クラスを修正することができます。
公開イベントMyEventHandler MyEvent。
(3)あなたは、高度なジェネリック版を使用している場合は、カスタムデリゲートを必要としません。あなたは、単にのためにイベントの種類を指定する必要があり 、そのクラスの名前に角括弧の内容を置き換えます、のEventHandler <MyEventArgs>。
公共のイベントのEventHandler <MyEventArgs> MyEvent。
第三に、シンプルなパブリッシュ・サブスクライブ・デモ
カスタムクラスとすることにより、次の例のMyEventArgs のEventHandler <TEventArgs> プレゼンテーション:
これはMyEventArgs.cs //イベントパラメータです
。/// 1 <概要> 2 ///イベントパラメータ 。3 /// </要約> 4 /// <備考>カスタムクラス:カスタムイベント引数</備考> 5 MyEventArgsクラス:のEventArgs 6 {。 メッセージ{パブリック文字列GET 7;} 8。 9 MyEventArgsパブリック(文字メッセージ)。 10 { 11 =メッセージメッセージ; 12である} 13}れます
これはPublisher.cs //出版社です
/// 1 <概要>。 2 ///イベント発行 3 /// </要約>。 4つのパブリッシャクラス。 5 { 6 //汎用イベントを宣言する。 7 EventHandlerのパブリックイベント<MyEventArgs> MyEvent; 8 9公共ボイド(パブリッシュ。 ) 10 { 11 Console.WriteLineを( "開始Publis IS") 12である 13を使用する前にいくつかのトリガ・イベントを書き込むことができる//コードである 14 )15 OnMyEvent(新しい新しいMyEventArgs(DateTime.Now.ToString()); 16} 17 18であります/ // <概要> 19 ///トリガイベント 20 /// </要約> 21 /// <PARAM NAME = "引数"> </ PARAM> 22 /// <備考>仮想メソッド呼び出しの上書き動作</備考>のサブクラスを許可します 仮想保護されたボイドが23(MyEventArgsの引数)OnMyEvent {24 トリガー・イベントの前に、25 //唯一のイベントサブスクリプション(!= null)を 26 MyEvent .Invoke(この、引数);? 27} 28}
これはSubscriber.cs //購読者であります
/// 1 <概要>。 2つの///サブスクライバ 3 /// </要約> 加入者クラス4。 5 { 6のGuidのGUID {公共GET;。} 。7 サブスクライバの8パブリック(出版社出版) 9 { 10 = GUIDをGuid.NewGuid (); // 2 11 C#構文を使用してサブスクライブ 12がpublisher.MyEvent + = Publisher_MyEventある; 13}である 14 15 /// <まとめ> 16 ///イベントハンドラ 17 /// </要約> 18である///ます。<param name = "SENDER"> </ param>の 19 ///ます。<param name = "引数"> </ param>の 20 Publisher_MyEventます。private void(SENDERオブジェクトがあり、MyEventArgs引数)MyEventArgs引数) 21 { 22 Console.WriteLineを($ "メッセージ{args.Messageは}、GUIDは{GUID}です。")。 23} 24}
これは、起動するためのProgram.cs //コンソールです
1クラスプログラム 2 { 3静的な無効メイン(文字列[] args) 4 { 5 VARパブリッシャが=新しい出版()。 6 VARのsubscriber1 =新たな加入者(出版社)。 7 VaRのsubscriber2など=新たな加入者(出版社)。 8 9 //触发事件 10 publisher.Publish()。 11 12 Console.WriteLineを( "OK!"); 13 Console.Read()。 14} 15}
第四に、カスタムイベントアクセサを実装
事件一种是特殊类型的多播委托,只能从声明它的类中进行调用。这些方法需要预先通过事件访问器添加到委托的调用列表中,事件访问器跟我们平时使用的属性访问器,特殊的是他们的名字,事件访问器被命名为 add 和 remove。如果在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。但在某些情况下,您可能需要提供自定义的行为。
1 class MyClass 2 { 3 /// <summary> 4 /// 锁 5 /// </summary> 6 private static object Locker = new object(); 7 8 /// <summary> 9 /// 接口 10 /// </summary> 11 public interface IMyEvent 12 { 13 event EventHandler OnCall; 14 } 15 16 public class MyEvent : IMyEvent 17 { 18 /// <summary> 19 /// 触发前事件 20 /// </summary> 21 event EventHandler PreEvent; 22 23 public event EventHandler OnCall 24 { 25 add 26 { 27 lock (Locker) 28 { 29 PreEvent += value; 30 } 31 } 32 remove 33 { 34 lock (Locker) 35 { 36 PreEvent += value; 37 } 38 } 39 } 40 } 41 }
传送门
「C#の知識のレビュー-委託代理人」、「C#の知識のレビュー-委託デリゲート(続き)」
【参考】https://msdn.microsoft.com/zh-cn/library/w369ty8x(v=vs.80).aspx
【参考】Microsoftの公式ドキュメント