不忘本~委托与事件

简介:

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的委托,当然它们也有其它很多重载,根据具体的应用去使用它们。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:不忘本~委托与事件,如需转载请自行联系原博主。

目录
相关文章
|
C#
艾伟_转载:解惑答疑:C#委托和事件
  相信很多人一直为C#委托和事件所困惑,尤其是C#的初学者,学到这一部分会感觉比较困难,很有可能就放弃了,而且.NET对委托和事件封装得挺好,一般都不怎么用到自定义的委托和事件,所以放弃学习该技术就有了借口!   网上也有不少此类的文章,最具代表性的是张子阳的C#中的委托和事件这篇,写得的确很好,...
1383 0
|
C#
艾伟:C# 中的委托和事件
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。
795 0
|
.NET
艾伟_转载:把委托说透(2):深入理解委托
在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口。本文将重点剖析委托的实质。 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastDelegate。
1105 0
|
C#
艾伟_转载:C#中的委托和事件-抛砖引玉
  最近在学习委托和事件,在书店里面看了好多书,但是都是迷迷的…… 今天在博客园里面看到了 张子阳 所写的博客C#中的委托和事件:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.
1196 0
|
监控 C#
艾伟_转载:把委托说透(1):开始委托之旅 委托与接口
委托,本是一个非常基础的.NET概念,但前一阵子在园子里却引起轩然大波。先是Michael Tao的随笔让人们将委托的写法与茴香豆联系到了一起,接着老赵又用一系列文章分析委托写法的演变,并告诫“嘲笑孔乙己的朋友们,你们在一味鄙视“茴”的四种写法的同时,说不定也失去了一个了解中国传统文化的机会呢!”。
999 0