C#の知識のレビュー - イベントイベントレビューC#の知識 - 式ツリー式木C#の知識レビュー - - C#のシリアライズレビューの知識属性特性解析AssemblyInfo.cs - C#の知識評価の一般的に使用される機能の属性を理解 - デリゲート(つづき)委託

【ブロガー】抗骨アバディーン[オリジナル] 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#の知識のレビュー-委託デリゲート(続き)

  「C の知識レビュー-イベントをはじめ

 


【参考】https://msdn.microsoft.com/zh-cn/library/w369ty8x(v=vs.80).aspx

【参考】Microsoftの公式ドキュメント

おすすめ

転載: www.cnblogs.com/wwwbdabc/p/11652722.html