今天再说说委托在.net中的发展吧,从1.1,2.0到3.0是有不同的,主要表现在定义,调用上,而使用上还是一样的.
在 1.0 的C# 版本中,声明委托的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托。 这对于 Lambda 表达式来说是不可能的。
下面实例中,我叫一个按钮button1分布使用了最原始的方法和匿名的方法来回调方法,看代码:
1 private void InitializeComponent() 2 3 { 4 5 this.button1 = new System.Windows.Forms.Button(); 6 7 this.SuspendLayout(); 8 9 // 10 11 // button1 12 13 // 14 15 this.button1.Location = new System.Drawing.Point(74, 40); 16 17 this.button1.Name = "testbtn1"; 18 19 this.button1.Size = new System.Drawing.Size(75, 23); 20 21 this.button1.TabIndex = 0; 22 23 this.button1.Text = "点我"; 24 25 this.button1.UseVisualStyleBackColor = true; 26 27 this.button1.Click += new System.EventHandler(this.button1_Click); 28 29 30 31 #region 为按钮的单击事件添加一个匿名的方法 32 33 this.button1.Click += delegate(System.Object o, System.EventArgs e) 34 35 { 36 37 System.Windows.Forms.MessageBox.Show("Click 1"); 38 39 }; 40 41 this.button1.Click += delegate(System.Object o, System.EventArgs e) 42 43 { 44 45 System.Windows.Forms.MessageBox.Show("Click 2"); 46 47 }; 48 49 #endregion
好了,对委托有了了解后,再来详细的看看MSDN是如何定义事件的吧:
事件(C# 编程指南)
类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。 可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。 IDE 会自动添加空事件处理程序方法和订阅事件的代码。
下图是一个按钮引发了一个事件:(订阅事件代码)
1 this.button1.Click += new System.EventHandler(this.button1_Click);
如果希望取消订阅可以这样写:
1 this.button1.Click -= new System.EventHandler(this.button1_Click);
而VS同时帮助我们添加了一个空的处理事件的方法,如下:
1 private void button1_Click(object sender, EventArgs e) 2 3 { 4 5 }
而这一切都是VS,IDE自动为我们做好的,不用我们去干预.