我来自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!");};
我们是否将该方法投射给代表?我以为该活动想要一个方法来订阅它?到底是什么东西?
答案 0 :(得分:2)
我们是否将该方法强制转换为委托?
嗯,你没有投射 - 但你正在使用方法组转换将方法名称转换为委托。
我认为该事件需要一个方法来订阅它?
不,事件需要委托订阅(或取消订阅)。您可以使用您提供的代码或更明确地使用方法创建一个委托实例:
button.Click += new EventHandler(HandleClick);
甚至将两者分开:
EventHandler handler = HandleClick; // Method group conversion
button.Click += handler; // Event subscription
...或者您可以从匿名函数(匿名方法或lambda表达式)创建委托实例。
有关详细信息,请参阅我的article on delegates and events。
答案 1 :(得分:0)
delegate
关键字正在创建一个新的匿名方法。然后(隐式)创建一个委托,该委托引用该匿名方法,并将该委托添加为该事件的委托之一。