1

デリゲートについて私が知っている限り、デリゲートは次のとおりです。

  • メソッドへのポインター。

  • また、一度に複数のメソッドを呼び出すことができます。

しかし、私が理解できないのは、一部のユーザーがイベントハンドラーをデリゲートとしてイベントを宣言していることです。例えば:

public void delegate MyDelegate(string Name);
public event MyDelegate EventOfDelegate;

しかし、デリゲートのイベントハンドラーを使用したイベントが何であるかはわかりません。イベントの内容を誰か説明してくれませんか? どこで使用でき、イベントハンドラーがデリゲートの名前である場合、それは何を意味しますか?

4

4 に答える 4

1

デリゲートとイベントとの関係について説明しているこの記事を読んでください。有名なジョン・スキートによって書かれたと思います。

于 2012-12-22T20:15:00.260 に答える
0
public delegate void MyDelegate(string Name);

この行は、戻り値の型が void で、文字列型の単一の入力パラメーターを持つデリゲートを宣言しています。次に、次のイベント宣言で使用されます。これは、基本的に、このイベントのサブスクライバーが、デリゲート定義で以前に定義されたものと同じ署名を持っている必要があることを意味します (多かれ少なかれ、トピックの詳細については、こちらを参照してください)。

于 2012-12-22T20:18:25.880 に答える
0

@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させることがわかります。PriceChangedPriceStock

于 2012-12-22T20:26:47.847 に答える