@Oded が投稿した質問でわかるように:
Event 宣言は、デリゲート インスタンスに抽象化と保護のレイヤーを追加します。この保護により、デリゲートのクライアントがデリゲートとその呼び出しリストをリセットできなくなり、呼び出しリストへのターゲットの追加または削除のみが許可されます。
これが必要になるのは、デリゲートとイベントを使用すると、2 つのロール ( Broadcaster と Subscriber ) が現れるためです。
「一言で言えばC#4」本から:
ブロードキャスターは、デリゲート フィールドを含む型です。ブロードキャスターは、デリゲートを呼び出して、いつブロードキャストするかを決定します。
サブスクライバーは、メソッドのターゲット受信者です。サブスクライバーは、ブロードキャスターのデリゲートで += および -= を呼び出して、リッスンを開始および停止するタイミングを決定します。サブスクライバーは、他のサブスクライバーを認識したり、干渉したりしません。
次に、イベントは、このモデル (サブスクライバー/ブロードキャスター モデル) に必要なデリゲート機能を公開するために使用される構造です。イベントの主な目的は、サブスクライバーが互いに干渉するのを防ぐことです。例えば:
友人とあなた自身について考えてみてください。あなたは友人と契約を結びます。この契約は以下で構成されます。
- あなたが活動を終えたら、あなたの友達はあなたの活動が終わったことを他の友達に知らせなければなりません。それらの友達は他の活動をしなければなりません。
この場合、あなたはブロードキャスターであり、あなたの友人はサブスクライバーであり、あなたの活動の終わりはイベントです。代表はどうですか?デリゲートはあなたの友人です。彼は他の友人にあなたの活動が終了したことを知らせ、彼らが他の活動を行えるようにする必要があるからです。
言い換えれば:
public delegate void PriceChangedHandler(decimal oldPrice, decimal newPrice);
public class Stock
{
string symbol;
decimal price;
public Stock(string symbol) { this.symbol = symbol; }
public event PriceChangedHandler PriceChanged;
public decimal Price
{
get {return Price;}
set
{
if(price == value) return;
if(PriceChanged != null) /* if invocation list is not empty, fire the event */
PriceChanged(price, value);
price = value;
}
}
が変更されるたびに、クラスがそのイベントを発生Stock
させることがわかります。PriceChanged
Price
Stock