随笔-27  评论-184  文章-11  trackbacks-16

关于委托(Delegate)的一个记录

混了这么久的C#,自以为对 Delegate 和 event 这样的基本概念已经了然于胸,却不曾想最近被一个这么基本特性给狠狠绊了一跤,实在是愧对天人,特此将这个问题暴露出来,警醒自己也提醒路人。

 

无标题

窗体的后台代码如下:

 1         private void btnDelegateAdd1_Click(object sender, EventArgs e)
 2         {
 3             button1.Click += new EventHandler(button1_Click);
 4         }
 5 
 6         private void btnDelegateAdd2_Click(object sender, EventArgs e)
 7         {
 8             button2.Click += delegate
 9             {
10                 MessageBox.Show("我是按钮 2""匿名方法");
11             };
12         }
13 
14         private void button1_Click(object sender, EventArgs e)
15         {
16             MessageBox.Show("我是按钮 1""普通方法");
17         }

 

 

原本以为对同一个对象的同一事件进行同一方法的多次挂载(+=),不会造成该事件处理函数被重复加入到事件列表中,即如上代码,如果多次点击“添加Delegate”和“添加匿名Delegate”按钮后,不会在点击下面相应测试按钮时,导致多次执行。之所以有这种自以为,是觉得这样的重复加入没有意义,事件的add和remove内置方法会负责判断处理函数是否已在事件列表之中,却不曾想,这样的假设实在是越俎代庖。

 

如果不希望多次重复挂载事件处理的话,需要自己做出判断,譬如上面的btnDelegateAdd1按钮事件可以这么写:

 

1         private void btnDelegateAdd1_Click(object sender, EventArgs e)
2         {
3             button1.Click -= new EventHandler(button1_Click);
4             button1.Click += new EventHandler(button1_Click);
5         }

 

 

但是,btnDelegateAdd2按钮事件中使用的是匿名方法,就没办法这样直接卸载事件处理函数了。

标签: delegate, c#, event
posted on 2010-07-09 16:48 钟少 阅读(260) 评论(5) 编辑 收藏

评论:
#1楼 2010-07-11 22:00 | ξζ暉惢淚ぷ      
顶一个
 回复 引用 查看   
#2楼 2010-07-27 13:16 | 秋叶雨寒      
拜读。
 回复 引用 查看   
#3楼 2010-07-30 21:06 | mrxliu      
那个delegate是个链表来的,简称委托链。
按钮的Click事件是 public event EventHandler Click;
EventHandler就是个委托。。。

 回复 引用 查看   
#4楼 2010-11-15 16:28 | HarryAlex[未注册用户]
厉害啊,请问委托好学不?俺不是太懂,很晕
 回复 引用   
#5楼[楼主] 2010-11-15 16:45 | 钟少      
@HarryAlex
建议你看看《CLR via C#》一书,看完后你就非常清楚了。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1774483 UaZOj2duJOI=
昵称:钟少
园龄:6年10个月
粉丝:21
关注:1
<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

友情链接

最新评论

阅读排行榜

评论排行榜

推荐排行榜