不忘本~委托与事件

返回目录

MSDN是这样定义委托的:

委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

下面这个委托及事件主要完成显示按钮名称和值的功能

     
 1 /// <summary>
 2 
 3     /// 自定义委托
 4 
 5     /// </summary>
 6 
 7     class SelfDelegate
 8 
 9     {
10 
11         /// <summary>
12 
13         /// 显示工具控件信息
14 
15         /// </summary>
16 
17         /// <param name="sender"></param>
18 
19         internal delegate void ToolInfo(object sender); //把委托看成是一种特殊的类,而事件就是委托类的一个实例
20 
21  
22 
23         /// <summary>
24 
25         /// 显示控件信息事件
26 
27         /// </summary>
28 
29         internal event SelfDelegate.ToolInfo ToolName;
30 
31  
32 
33         /// <summary>
34 
35         /// 事件触发机制
36 
37         /// </summary>
38 
39         /// <param name="sender"></param>
40 
41         internal void doEvent(object sender)
42 
43         {
44 
45             ToolName(sender);//事件名(方法签名)
46 
47         }
48 
49  
50 
51     }

 

在Form1部分类中的内容是:

     
 1   SelfDelegate sd = new SelfDelegate();
 2 
 3         /// <summary>
 4 
 5         /// this.button1.Click += new System.EventHandler(this.button1_Click);
 6 
 7         /// 为事件加上一个委托实例,这行是VS自动添加上去的
 8 
 9         /// this.button1就是我们刚刚添加的按钮
10 
11         /// </summary>
12 
13         /// <param name="sender"></param>
14 
15         /// <param name="e"></param>
16 
17         private void button1_Click(object sender, EventArgs e)
18 
19         {
20 
21             MessageBox.Show("按钮单击事件被触发");
22 
23  
24 
25             sd.ToolName += new SelfDelegate.ToolInfo(ShowToolName);
26 
27             sd.ToolName += new SelfDelegate.ToolInfo(ShowToolValue);
28 
29             sd.doEvent(sender); //将本对象源作为参数传递
30 
31         }
32 
33  
34 
35         #region 实现了委托方法签名的方法
36 
37         /// <summary>
38 
39         /// 显示控件名称
40 
41         /// </summary>
42 
43         /// <param name="sender"></param>
44 
45         private void ShowToolName(object sender)
46 
47         {
48 
49             Button btn = sender as Button;
50 
51             if (btn != null) //转换成功,失败为null,系统不会抛异常
52 
53             {
54 
55                 MessageBox.Show(string.Format("控件名称:{0}", btn.Name));
56 
57             }
58 
59         }
60 
61  
62 
63         private void ShowToolValue(object sender)
64 
65         {
66 
67             Button btn = sender as Button;
68 
69             if (btn != null) //转换成功,失败为null,系统不会抛异常
70 
71             {
72 
73                 MessageBox.Show(string.Format("控件值:{0}", btn.Text));
74 
75             }
76 
77         }
78 
79         #endregion

进行.net4.0之后,frameworks帮我们封装了很多委托,其中Action和Func<T>是比较常用的,Action表示一个没有返回值的委托,而Func<T>表示一个返回值类型为T的委托,当然它们也有其它很多重载,根据具体的应用去使用它们。

返回目录

 返回目录

posted @ 2011-06-09 14:16  张占岭  阅读(630)  评论(0编辑  收藏  举报