MSDN是这样定义委托的:
委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。
下面这个委托及事件主要完成显示按钮名称和值的功能
/// <summary>
/// 自定义委托
/// </summary>
class SelfDelegate
{
/// <summary>
/// 显示工具控件信息
/// </summary>
/// <param name="sender"></param>
internal delegate void ToolInfo(object sender); //把委托看成是一种特殊的类,而事件就是委托类的一个实例
/// <summary>
/// 显示控件信息事件
/// </summary>
internal event SelfDelegate.ToolInfo ToolName;
/// <summary>
/// 事件触发机制
/// </summary>
/// <param name="sender"></param>
internal void doEvent(object sender)
{
ToolName(sender);//事件名(方法签名)
}
}
在Form1部分类中的内容是:
SelfDelegate sd = new SelfDelegate();
/// <summary>
/// this.button1.Click += new System.EventHandler(this.button1_Click);
/// 为事件加上一个委托实例,这行是VS自动添加上去的
/// this.button1就是我们刚刚添加的按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("按钮单击事件被触发");
sd.ToolName += new SelfDelegate.ToolInfo(ShowToolName);
sd.ToolName += new SelfDelegate.ToolInfo(ShowToolValue);
sd.doEvent(sender); //将本对象源作为参数传递
}
#region 实现了委托方法签名的方法
/// <summary>
/// 显示控件名称
/// </summary>
/// <param name="sender"></param>
private void ShowToolName(object sender)
{
Button btn = sender as Button;
if (btn != null) //转换成功,失败为null,系统不会抛异常
{
MessageBox.Show(string.Format("控件名称:{0}", btn.Name));
}
}
private void ShowToolValue(object sender)
{
Button btn = sender as Button;
if (btn != null) //转换成功,失败为null,系统不会抛异常
{
MessageBox.Show(string.Format("控件值:{0}", btn.Text));
}
}
#endregion
今天再说说委托在.net中的发展吧,从1.1,2.0到3.0是有不同的,主要表现在定义,调用上,而使用上还是一样的.
在 1.0 的C# 版本中,声明
委托的唯一方法是使用
命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托。 这对于 Lambda 表达式来说是不可能的。
下面实例中,我叫一个按钮button1分布使用了最原始的方法和匿名的方法来回调方法,看代码:
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(74, 40);
this.button1.Name = "testbtn1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "点我";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
#region 为按钮的单击事件添加一个匿名的方法
this.button1.Click += delegate(System.Object o, System.EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Click 1");
};
this.button1.Click += delegate(System.Object o, System.EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Click 2");
};
#endregion
好了,对委托有了了解后,再来详细的看看MSDN是如何定义事件的吧:
8967

被折叠的 条评论
为什么被折叠?



