C#中EventHander 和 delegate

      我的博客全面迁移到:http://hefujian.com/  

      EventHander delegate 都是委托的一种,什么是委托,委托可以简单地理解成,当两个类需要共同地完成一个方法的时候,我们就在该方法体内使用委托。

    如何理解共同完成的一个方法呢?

    先看看下面例子,程序里包括两类:Class1.cs和Program.cs,还有一个参数类TestArg.cs。

class1.cs的代码如下:

  1. public class Class1
  2.     {
  3.         public event EventHandler beginConstructors;
  4.         public event EventHandler<testArgs> endConstructors;
  5.         public testArgs a  = new testArgs();
  6.         public Class1()
  7.         {}
  8.         public void Test()
  9.         {
  10.             a.Test = "this is a test";
  11.             if (beginConstructors != null) ;
  12.                 beginConstructors(this, a);
  13.             Console.WriteLine("in the Test");
  14.             if(endConstructors!=null)
  15.                 endConstructors(this, a);
  16.             Console.WriteLine("End");
  17.         }
  18.     }

 

    这里的Test()方法就是需要两个类共同完成的方法。beginConstructorsendConstructors就是两个委托,利用这两个委托,Program类可以在他的里面继续丰富这个Test()方法。当然如果beginConstructorsendConstructorsProgram里面没有去订阅的话,那么Test()方法就只有Console.WriteLine("in the Test");Console.WriteLine("End");这两个操作了。

 

下面我们看看Program的代码:

  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Class1 cls = new Class1();
  6.             cls.beginConstructors+=new EventHandler(cls_beginConstructors);  
  7.             cls.endConstructors += new EventHandler<testArgs>(cls_endConstructors);
  8.             cls.Test();
  9.             Console.WriteLine("----------------------");
  10.             Console.ReadLine();
  11.         }
  12.         static void cls_beginConstructors(object sender, EventArgs e)
  13.         {
  14.             testArgs arg = (testArgs) e;
  15.             Console.WriteLine("<<<event test 1");
  16.             Console.WriteLine("<<<Class1 的参数 是 {0}", arg.Test);
  17.         }
  18.         static void cls_endConstructors(object sender, testArgs e)
  19.         {
  20.             Console.WriteLine("<<<event test 2");
  21.             Console.WriteLine("<<<Class1 的参数 是 {0}", e.Test);
  22.         }
  23.     }

下面写出testArgs的代码:

  1. public class testArgs : EventArgs
  2.     {
  3.         private string test = "";
  4.         public string Test
  5.         {
  6.             get
  7.             {
  8.                 return test;
  9.             }
  10.             set
  11.             {
  12.                 test = value;
  13.             }
  14.         }
  15.     }

这个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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值