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);

甚至将两者分开:

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

...或者您可以从匿名函数(匿名方法或 lambda 表达式)创建委托实例。

有关更多信息,请参阅我关于代表和事件的文章。

于 2013-10-22T17:17:55.783 回答
0

delegate关键字是创建一个新的匿名方法。然后(隐式)创建一个引用该匿名方法的委托,并将该委托添加为该事件的委托之一。

于 2013-10-22T17:18:23.700 回答