0

私は Java のバックグラウンドを持ち、現在 c# を学んでいます。

メソッドをイベントにサブスクライブしたい場合は、次のようにすることを理解しています。

button.Click += HandleClick;

void HandleClick (object sender, EventArgs e) {
   button.Text = string.Format (count++ + " clicks!"); 
}

ただし、これを次のように書くと次​​のようになります。

button.Click += delegate {button.Text = string.Format (count++ + " clicks!");};

メソッドをデリゲートにキャストしていますか? イベントはメソッドをサブスクライブする必要があると思いましたか? 上で起こっていることは正確には何ですか?

4

2 に答える 2

3

メソッドをデリゲートにキャストしていますか?

キャストではありませんが、メソッド グループ変換を使用してメソッド名をデリゲートに変換しています。

イベントはメソッドをサブスクライブする必要があると思いましたか?

いいえ、イベントをサブスクライブする (またはサブスクライブを解除する) には、デリゲートが必要です。指定したコードまたはより明示的に、メソッドからデリゲート インスタンスを作成できます。

button.Click += new EventHandler(HandleClick);

または、2 つを分離することもできます。

EventHandler handler = HandleClick; // Method group conversion
button.Click += handler;            // Event subscription

... または、匿名関数 (匿名メソッドまたはラムダ式) からデリゲート インスタンスを作成することもできます。

詳細については、デリゲートとイベントに関する私の記事を参照してください。

于 2013-10-22T17:17:55.783 に答える
0

delegateキーワードは、新しい匿名メソッドを作成しています。次に、その匿名メソッドを参照するデリゲートが (暗黙的に) 作成され、そのデリゲートがそのイベントのデリゲートの 1 つとして追加されます。

于 2013-10-22T17:18:23.700 に答える