1
Button.Click += new RoutedEventHandler(_click);

private void _click(object sender EventArgs e) 
{
   //... 
} 

上記のコードでは、デリゲートである RoutedEventHandler 型を Button.Click イベントでインスタンス化しています。しかし、イベントはそれ自体が抽象化されたデリゲートですよね? これと、 RoutedEventHandler を変数にインスタンス化してから、変数をインスタンスの呼び出しリストに追加することとの違いがわかりません。私はこれを難しくしすぎていますか?ここに関係するすべての代表者はどのように機能しますか?

編集:私の主な関心事は、デリゲートについて知っていることとイベントについて知っていることの間のギャップを埋めようとすることです。イベントは、抽象化の別のレイヤーにラップされたデリゲートであることを知っています。つまり、+= 演算子を使用して別のデリゲートを呼び出しリストに割り当てると、デリゲートを別のデリゲートに割り当てるだけですよね? しかし、上で書いたコードでは、RoutedEventHandler クラスを実際にインスタンス化しているわけではないので、Button.Click イベントの呼び出しリストに実際に渡す方法について混乱しています。また、すべてが実際にはデリゲートとイベントで別のものを指しているように見え、参照が複雑になるため、混乱します。

4

3 に答える 3

1

イベントは、デリゲートのコレクションのラッパーと考えることができます(メンバーを追加/削除するための構文上の糖衣構文を使用)。イベントは、複数のデリゲートへの呼び出しのマルチキャストを処理します。カスタムロジックを追加して、デリゲートを追加できるようにする(または追加しない)ことができます(プロパティでフィールドをラップし、プロパティのゲッター/セッターにロジックを追加するのと同じ方法です)。 )。クラスにイベントがあると、ハンドラー(デリゲートとして実装される)を安全に追加してそのイベントを受信できることを世界に「アドバタイズ」します。これにより、VisualStudioなどのIDEとの設計時の統合などが可能になります。

于 2012-05-17T23:25:14.507 に答える
1

イベントのコンテキストでデリゲートを使用すると、コンパイラは、デリゲートの提供バッキング フィールドと、サブスクライバーがイベントにアタッチするための追加/削除パブリック プロパティの両方を生成します。説明したように、デリゲートをイベントとして使用することもできますが、サブスクライバーを += と -= だけに制限することはできません。

private EventHandler _backingDelegate;
public event EventHandler Click {
   add {
         _backingDelegate += value;
   } 
   remove {
         _backingDelegate -= value;
   }
}
于 2012-05-17T23:35:54.410 に答える
1

おそらく、この答えはあなたを助けるでしょう.彼はそれを非常に詳細に説明しています:-

イベント

于 2012-05-19T22:59:39.880 に答える