C#事件-换一个角度理解委托和事件
我们建一个控制台程序。
未使用委托、事件之前的代码
using System;
class Program
{
static void Main(string[] args)
{
//实例化一个button类
Button btn = new Button();
btn.Click();
}
}
//首先要定义一个Button类,里面应该有一个Click方法
public class Button
{
//Click方法调用固定的方法
public void Click()
{
ForCustome fc = new ForCustome();
fc.Button_Click();
}
}
//上面这个类是封装了的,用户不可见,或者理解为用户不能更
改也可以
//下面这个类提供给用户
public class ForCustome
{
public void Button_Click()
{
//用户在这里写具体的方法实现
Console.WriteLine("被点击了!");
}
}
可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。不到黄河心不甘,我们硬着头皮再写两个按钮的情况吧。
using System;
class Program
{
static void Main(string[] args)
{
//实例化一个button类
Button btn = new Button();
btn.Click();
//实例化第二个button
Button btn2 = new Button();
btn2.Click(); //这样写能行么?我们发现,这样写根本不行!
}
}
//首先要定义一个Button类,里面应该有一个Click方法
public class Button
{
//Click方法调用固定的方法
public void Click()
{
ForCustome fc = new ForCustome();
fc.Button_Click();
//很想在这里面改呀,添一个方法调用
fc.Button2_Click(); //要是再有一段条件判断的逻辑就更好了,是吧?
}
}
//上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以
//下面这个类提供给用户
public class ForCustome
{
public void Button_Click()
{
//用户在这里写具体的方法实现
Console.WriteLine("被点击了!");
}
//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("我是第二个被点击的按钮!");
}
}
如果你是自己在试着写的话,估计你已经崩溃了,这样实现太难了!
好了,看看微软是如何解决这个问题的吧。
using System;
//先声明一个委托再说,目标是要能调用ForCustome类里的方法,所以注意方法签名
public delegate void myDelegate();
public class Button
{
//声明一个事件,和委托相关联
public event myDelegate ClickIt;
public void Click()
{
//可以想象,这个方法是一个封装了之前我们想要的一大段条件判断语句的“复合体”
ClickIt();
}
}
class Program
{
static void Main(string[] args)
{
ForCustome fc = new ForCustome();
//实例化一个button类
Button btn = new Button();
//这里,将按钮的事件和按钮事件对应的(将要触发的)方法相关联,相当于我们之前想象的注册
btn.ClickIt += new myDelegate(fc.Button_Click);
btn.Click();
//实例化第二个button
Button btn2 = new Button();
btn2.ClickIt+=new myDelegate(fc.Button2_Click);
btn2.Click(); //这样写能行么?
}
}
//这个类提供给用户的,没有变化
public class ForCustome
{
public void Button_Click()
{
//用户在这里写具体的方法实现
Console.WriteLine("被点击了!");
}
//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("我是第二个被点击的按钮!");
}
}