我的博客全面迁移到:http://hefujian.com/
EventHander 和delegate 都是委托的一种,什么是委托,委托可以简单地理解成,当两个类需要共同地完成一个方法的时候,我们就在该方法体内使用委托。
如何理解共同完成的一个方法呢?
先看看下面例子,程序里包括两类:Class1.cs和Program.cs,还有一个参数类TestArg.cs。
在class1.cs的代码如下:
- public class Class1
- {
- public event EventHandler beginConstructors;
- public event EventHandler<testArgs> endConstructors;
- public testArgs a = new testArgs();
- public Class1()
- {}
- public void Test()
- {
- a.Test = "this is a test";
- if (beginConstructors != null) ;
- beginConstructors(this, a);
- Console.WriteLine("in the Test");
- if(endConstructors!=null)
- endConstructors(this, a);
- Console.WriteLine("End");
- }
- }
这里的Test()方法就是需要两个类共同完成的方法。beginConstructors和endConstructors就是两个委托,利用这两个委托,Program类可以在他的里面继续丰富这个Test()方法。当然如果beginConstructors和endConstructors在Program里面没有去订阅的话,那么Test()方法就只有Console.WriteLine("in the Test");和Console.WriteLine("End");这两个操作了。
下面我们看看Program的代码:
- class Program
- {
- static void Main(string[] args)
- {
- Class1 cls = new Class1();
- cls.beginConstructors+=new EventHandler(cls_beginConstructors);
- cls.endConstructors += new EventHandler<testArgs>(cls_endConstructors);
- cls.Test();
- Console.WriteLine("----------------------");
- Console.ReadLine();
- }
- static void cls_beginConstructors(object sender, EventArgs e)
- {
- testArgs arg = (testArgs) e;
- Console.WriteLine("<<<event test 1");
- Console.WriteLine("<<<Class1 的参数 是 {0}", arg.Test);
- }
- static void cls_endConstructors(object sender, testArgs e)
- {
- Console.WriteLine("<<<event test 2");
- Console.WriteLine("<<<Class1 的参数 是 {0}", e.Test);
- }
- }
下面写出testArgs的代码:
- public class testArgs : EventArgs
- {
- private string test = "";
- public string Test
- {
- get
- {
- return test;
- }
- set
- {
- test = value;
- }
- }
- }
这个test方法执行的顺序是这样的
1. Test = "this is a test";
2. static void cls_beginConstructors(object sender, EventArgs e)
{
testArgs arg = (testArgs) e;
Console.WriteLine("<<<event test 1");
Console.WriteLine("<<<Class1 的参数 是 {0}", arg.Test);
}
3. Console.WriteLine("in the Test");
4. static void cls_endConstructors(object sender, testArgs e)
{
Console.WriteLine("<<<event test 2");
Console.WriteLine("<<<Class1 的参数 是 {0}", e.Test);
}
5. Console.WriteLine("End");
其中红色部分为Progem类里提供的实现。
由上面例子我们可以轻松地了解到了委托的好处,就是当两个类中有一个方法,必须共同实现的时候(例如:该方法需要有另一个类的部分参数或属性才能完成,或者,需要由另一个类协助完成,也或者开发一个通用组件或控件时),我们可以使用委托。
另外,大家会留意到,在Class1类里面,定义委托有两种形式
1. public event EventHandler beginConstructors;
2. public event EventHandler<testArgs> endConstructors;
究竟有什么不同?
主要不同在于,当我们订阅这两个事件时使用到的参数不同,
static void cls_beginConstructors(object sender, EventArgs e)和
static void cls_endConstructors(object sender, testArgs e)
第一个是使用普通的事件参数,第二个使用了自定义的事件参数。
我的博客全面迁移到:http://hefujian.com/