0
public delegate void EventHandler(object sender, EventArgs e);
public class Button: Control
{
   public event EventHandler Click;
   protected void OnClick(EventArgs e) {
      if (Click != null) Click(this, e);
   }

}

この本では、上記のコードを次のように説明しています。

Button クラスの OnClick メソッドは、Click イベントを「発生させます」。イベントを発生させるという概念は、イベントによって表されるデリゲートを呼び出すこととまったく同じです。したがって、イベントを発生させるための特別な言語構造はありません。デリゲートの呼び出しの前に、デリゲートが null でないことを確認するチェックが行われることに注意してください。

すべてのイベント ハンドラーにデリゲート インスタンスがあるのに、イベントにデリゲートが 1 つしかないことを意味するのはなぜですか? インスタンスはインスタンスであり、イベントには実際のメソッドに接続する多くのデリゲート インスタンスを含めることができます。

誰かが私のためにこの段落を理解していただければ幸いです。

4

2 に答える 2

0

これは詳細であり、探しているものとは異なる場合があります。しかし、それはイベントとデリゲートの違いを非常に詳細に分析しています... ILに至るまで。

それ以外の場合:この SO は、より簡単な基準で既に回答されています

于 2013-04-10T02:37:15.480 に答える
0

「イベントによって表されるデリゲート」とはどういう意味ですか?

これは、イベントを発生させるコードの観点からイベントがどのように見えるかです。イベントは、標準のメソッド呼び出し構文 (「特別な」構文とは対照的に) を使用して発生します。この構文は、サブスクライブされたすべてのイベント ハンドラーを順不同で呼び出します。

そして、「デリゲートがnullでないことを確認するチェック」とはどういう意味ですか?

イベントにサブスクライブされているイベント ハンドラーがない場合、"イベントを表すデリゲート" は null です。したがって、イベントを発生させるには、次のようにする必要があります。

class MyClass {

    public delegate void MyEventHandler(MyEventArg arg);

    public event MyEventHandler MyEvent;

    void RaiseMyEvent(MyEventArg arg) {
        var handler = MyEvent;
        if (handler != null) // Any subscribers?
            handler(arg);
    }

}

ところで、この理由から、イベントをローカル変数 ( handler) にコピーすることは良い習慣と考えられています。

于 2013-04-10T02:56:20.500 に答える