不忘本~委托与事件

返回目录

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 @   张占岭  阅读(632)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示