マルチキャストデリゲートとイベント
1.定義と使用を委任マルチキャスト
私たちは、デリゲートの実行に渡されたパラメータなどの方法によって達成することができる信頼しています。同様に、我々はまた、より多くの方法を委任順番に実行することができ、その後、我々は、マルチキャストデリゲートを必要とします。
非接触マルチキャストデリゲートの定義を委任する前、次のように、私たちは複数のメソッドを呼び出します。
=パラReturnWithPara 新しい新 ReturnWithPara(ShowId); // 現在のクラスのメソッド ReturnWithPara PARA1 = ShowId; // 現在のクラスのメソッド ReturnWithPara PARA2 =(I、名前)=> Console.WriteLineを(" ID:" + I + 」、名:" +名); // ラムダ式 ReturnWithPara PARA3 = 新しい新。OtherClass()ShowId; // 外部クラスのメソッドの例 ReturnWithPara para4 = OtherClass.ShowIdStatic; // クラス外の静的メソッド
マルチキャストデリゲートを使用する場合は、次のように、私たちのコードは次のとおりです。
// マルチキャストデリゲート方法:+ =実行順序に従って、方法、チェーンを形成する方法を追加することによって ReturnWithParaパラ= 新しい新しい ReturnWithPara(ShowId); // 現在のクラスメソッド パラ+ = ShowIdと、 パラ + =(I、名前)= > Console.WriteLineを(" ID:" + I + " 名:" +名); // ラムダ式 パラ+ = 新しい新しい OtherClass()ShowId; // 外側のクラスのメソッドの例 パラ+ = OtherClass.ShowIdStatic。// 外部クラスの静的メソッド para.Invoke(21、「ジョー・スミス」);
マルチキャストデリゲート方法:+ =添加法、チェーンを形成する方法であって、起動時の添加の順序によって実行される方法による。
同様に、我々はまたことができる- =以下に示すように、デリゲートインスタンス除去方法を
// マルチキャストデリゲートが除去される: -満たし、尾マッチング法チェーンから開始、デリゲートのインスタンスを削除するために=法と完全に一致する最初の削除、一度だけ除去することにより、 パラ- = ShowId; パラ - = (I、名前)=> Console.WriteLineを(" ID:" + I + " 名:" +名); // ラムダ式 パラ- = 新しい新しい OtherClass()ShowId; // 外側のクラスのメソッドの例 パラ- = OtherClass.ShowIdStatic; // クラス外部静的メソッド para.Invoke(22は、" ジョン・ドウ")。
注:マルチキャストデリゲートを除去する:ことによって - =尾マッチング法チェーンから開始、デリゲートのインスタンスを削除する方法は、完全に一致する最初の出会いを除去し、一度だけ除去
上記のコードが実行された後、我々はわかります(I、名前)=> Console.WriteLineを(「番号:」+ I + 「名:」+名)、および新しい新OtherClassは()ShowId、正常に削除されません。
1.各ラムダ式はコンパイル時に異なるアプローチを生成しますが、それらはすべて同じインスタンスに属している:これがためです。したがって、ラムダ式を削除することはできません、それは推奨されませんラムダ式の文言
2.new OtherClass()。ShowIdは、2つの異なる匿名オブジェクト、それを除去することができないので、除去することができません
マルチキャストデリゲートは(例:para.BeginInvoke(22、「ジョン・ドウ」);)直接非同期メソッドを呼び出すことはできませんあなたが非同期呼び出しを使用したい場合は、次の方法を取ることができます
=パラReturnWithPara 新しい新 ReturnWithPara(ShowId); // 現在のクラスメソッド + =パラShowId; パラ + =(I、名前)=> Console.WriteLineを(" ID:" + I + " 名:" +名)。// ラムダ式 パラ+ = 新しい新しい OtherClass();. ShowId // 外側のクラスのメソッドの例 OtherClass.ShowIdStaticパラ+ =を; // クラス外部静的メソッド のforeach(VARの項目でpara.GetInvocationList()) { para.BeginInvoke (21、" ジョー・スミス"、NULL 、項目); }
上記のコードでは、我々はすべてのメソッドpara.GetInvocationList()メソッドによって実行されるGET、各ループは、非同期メソッドが実行されます。
注意:マルチキャストデリゲートにマルチキャストデリゲートの実装は、唯一の戻り値の戻り値と最後のメソッドを返すことにより、そのマルチキャストデリゲートは、戻り値を委託には適用されません。
マルチキャストデリゲートは、頻繁にシーンモードオブザーバを使用しています。次のコードに示すように
私たちは、最初の猫、鶏や他のエンティティを定義し、各イベントには、方法があります。猫のミャオ族の方法は、赤ちゃんが泣いようにして、コックのカラスを引き起こし、デリゲートCathanderを定義するCatクラスを連鎖反応を引き起こします
パブリック クラスキャット { 公共 空ミャオ族() { Console.WriteLineを(" ミャオ族···· " ); もし(!Cathander = ヌル) { Cathander.Invoke(); } } パブリックアクションCathander。 }
次のように上部の呼び出し元のプログラムでは、次のとおりです。
猫猫= 新しいキャット(); cat.Cathander + = 新しいチキン()臥。 cat.Cathander + = 新しい犬()王。 cat.Cathander + = 新しい赤ちゃん()クライ。 cat.Cathander + = 新しい父()咆哮。 cat.Cathander + = 新しいブラザー()にしてください。; cat.Cathander + = 新しい母()を実行します。 cat.Miao();
cat.Miao()は、マルチキャストデリゲートの結合事象を実施した後に呼び出され Cathander
オブザーバーデザインパターンを使用する利点:Catクラスの安定性を確保するためには、要件が変更されたときに、単に懸念猫のコードなしで、トップへの呼び出しを変更します
2.イベント
定義:マルチキャスト上で定義されたデリゲートプラスイベントのキーワードは、以下に示すように、イベントCathanderEventを定義して、我々のサブああ猫
パブリック イベントアクションCathanderEvent。 公共 ボイドMiaoEvent() { Console.WriteLineを(" ミャオ···· " )。 もし(!CathanderEvent = ヌル) { CathanderEvent.Invoke(); } }
コールの実行を購入するアッパー:
猫猫= 新しいキャット(); cat.CathanderEvent + = 新しいチキン()臥。 cat.CathanderEvent + = 新しい犬()王。 cat.CathanderEvent + = 新しい赤ちゃん()クライ。 cat.CathanderEvent + = 新しい父()咆哮。 cat.CathanderEvent + = 新しいブラザー()にしてください。; cat.CathanderEvent + = 新しい母()を実行します。 cat.MiaoEvent();
上記のコードを観察し、マルチキャストデリゲートは非常に似ています。
イベントとの違いとの接続3.マルチキャストデリゲート
上記の記述部分から、私たちは、マルチキャストデリゲートを感じると、イベントが非常に似ているので、なぜ私たちは事件を費やす必要があるかどうか?
イベントは、アクセス制限、クラス(またはサブクラス定義クラス)で定義された外部イベントを追加しただけで、外部と+ = - =。同様のcat.CathanderEventは唯一のクラス定義イベント内から利用できる、この割り当てのようにnullを割り当てられていません=。
イベントデリゲートとの違いとの接続:デリゲートはクラスで、イベントは、エンティティオブジェクトのデリゲートであります
4.シナリオイベントの使用
広く使用されているイベント、主に含まれています。
制御サーバの1 Clickイベント、ドロップダウンイベント。
図2に示すように、Webフォームページのライフサイクル、様々なページ・レベル・イベント(pre_init、をPage_Load、のApplication_Start)。
3.要求レベルのイベント:定期的な登録モジュールなど