首先我先介绍一个简单的小例子解释一下委托的用法;代码如下:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication3

{

     class Program

     {

    

         static void Main(string[] args)

         {

              DelegateTest delegatetest = new DelegateTest();

              delegatetest.test();

         }

        

     }

     class DelegateTest

     {

         public DelegateTest()

         {

 

         }

         public delegate void TheEvent(int a);

         public void test()

         {

              TheEvent testdel1 = new TheEvent(del1);

              testdel1(12);

         }

 

         public void del1(int x)

         {

              Console.WriteLine("output x : {0}", x);

         }

     }

}

 

下边是一个比较复杂的例子是事件加委托。举一个实际生活中例子 如在我公司里领导让我负责看管Z同志如果他玩游戏我就扣他的钱,

下边的例子来源于http://www.aspxboy.com/Files/71/67/281.Aspx

http://www.ddvip.net/program/c-/index1/116.htm

我和Z同事是两个对象,Z还有一个玩游戏的方法,和一个游戏事件,他一旦开始玩游戏,就触发游戏事件,而我就是那个处理事件的对象,负责扣他的钱。

 

所以委托要有以下几个要素

 

²       激发事件的对象:就是这里的Z同事

²       处理事件的对象:就是这里的我

²       定义委托:就是我要监视Z同事

 

下边是源代码

using System;

using System.Collections.Generic;

using System.Text;

 

namespace CSharpConsole

{

     // 定义委托处理程序

     public delegate void PlayGameHandler(object sender, System.EventArgs e);

     class Program

     {

        

        

         static void Main(string[] args)

         {

              Console.WriteLine("开始了....");

              yangm yangming=new yangm();

              Z zz=new Z();

              // 指定监视

              zz.PlayGame += new PlayGameHandler(yangming.扣钱);//在处理对象该函数中要与定义处理程序的参数相同

              zz.玩游戏();

 

 

         }

     }

     class yangm

     {

         public yangm()

         {

              Console.WriteLine("初始化yangm");

         }

         public void 扣钱(object sender, EventArgs e)

         {

              Z  f = (Z )sender;//表明事件由谁来触发

              f.= f.- 500;

              Console.WriteLine("我可扣了Z同事的钱了");

              Console.WriteLine(f..ToString());

         }

     }

     class Z

     {

        

         private int m_Money;

 

         public Z()

         {

              Console.WriteLine("初始化Z");

              m_Money = 1000;

         }

 

         //定义委托处理程序

        

         // 先定义一个事件,这个事件表示“Z”在玩游戏。

         public event PlayGameHandler PlayGame;

 

         public int // 此属性可以操作Z的钱。

         {

              get

              {

                   return m_Money;

              }

              set

              {

                   m_Money = value;

              }

         }

         public void 玩游戏()

         {

              Console.WriteLine("Z开始玩游戏了.....");

              System.Threading.Thread.Sleep(500);

              System.EventArgs e = new EventArgs();

              OnPlayGame(e);

         }

         protected virtual void OnPlayGame(EventArgs e)

         {

              PlayGame(this,e);

 

         }

     }

}

如果明白了,如何自己定义事件和委托。请继续看下边的另一个应用,这个应用是用在自动化测试上的,它的目的是把所有的测试案例联系在一起运行下边是源代码。

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

namespace caselist

{

     delegate void  TestCase();

     class Program

     {

         public void Run(string[] args)

         {

              Hashtable col = new Hashtable(200);

              col.Add("1",new TestCase(Testcase13680.Execute));哈希表里的是一个委托的实例

              col.Add("2",new TestCase(Testcase13681.Execute));

              if (args.Length == 0)

                   foreach (DictionaryEntry entry in col)//遍历哈希表

                   {

                       RunTest((string)entry.Key, (TestCase)entry.Value);//

                  }

              else

              {

                   for (int i = 0; i < args.Length; ++i)

                       if (col.Contains(args[i]))

                            RunTest(args[i], (TestCase)col[args[i]]);

              }

             

        

         }

         public void RunTest(string casenum, TestCase testcase)//

         {

              testcase();//调用委托实例所指向的方法

         }

         static void Main(string[] args)

         {

              string[] mergeTests =

              {"1" ,"2"};

              Program test = new Program();

              if (args.Length != 0)

                   test.Run(args);

              else

                   test.Run(mergeTests);

         }

     }

    

     public class Testcase13680

     {

         public Testcase13680()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         public static void  Execute()

         {

              NotconnectedHidedetailswindow13680();

         }

         public static void  NotconnectedHidedetailswindow13680()

         {

 

              Console.WriteLine("First Case");

         }

 

     }

     public class Testcase13681

     {

         public Testcase13681()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         public static void Execute()

         {

              NotconnectedHidedetailswindow13681();

         }

         public static void NotconnectedHidedetailswindow13681()

         {

Console.WriteLine("Second Case");

         }

}

}