來自:http://www.aspxboy.com/Files/71/67/281.Aspx
有許多人問的,.Net中的委托以及事件處理。我拿簡單的例子說明一下,是現(xiàn)實(shí)中的例子:

比如說一個(gè)公司(場景),你是老板,手下有兩個(gè)員工,小張和小王。
你命令小王,如果小張玩游戲,則小王扣去小張500元錢。

這就是現(xiàn)實(shí)中的委托。

實(shí)際上,在寫程序中,程序員就是老板,小張和小王就是兩個(gè)對(duì)象。小張玩游戲是一個(gè)方法,小張還有一個(gè)游戲事件,他玩游戲激發(fā)這個(gè)事件。而小王就是事件處理對(duì)象,他負(fù)責(zé)把小張的錢扣除500。

所以,委托有如下幾個(gè)要素:
1 激發(fā)事件的對(duì)象--就是小張
2 處理對(duì)象事件的對(duì)象--就是小王
3 定義委托,就是你讓小王監(jiān)視小張。

如果這三個(gè)要素都滿足的話,則你就寫出了一個(gè)完整事件的處理。

下面有個(gè)例子:在vs.net2003 C#控制臺(tái)應(yīng)用程序編輯運(yùn)行成功:
using System;

namespace CSharpConsole
{
 public class 場景
 {
  [STAThread]
  public static void Main(string[] args)
  {
   Console.WriteLine("場景開始了....");
   // 生成小王
   小王 w = new 小王();
   // 生成小賬
   小張 z = new 小張();

   // 指定監(jiān)視
   z.PlayGame += new PlayGameHandler(w.扣錢);

   // 開始玩游戲
   z.玩游戲();

   Console.WriteLine("場景結(jié)束...");
   Console.ReadLine();
  }
 }

 

 // 負(fù)責(zé)扣錢的人
 public class 小王
 {
  public 小王()
  {
   Console.WriteLine("生成小王...");
  }

  public void 扣錢(object sender,EventArgs e)
  {
   Console.WriteLine("小王:好小子,上班時(shí)間膽敢玩游戲...");
   Console.WriteLine("小王:看看你小子有多少錢...");
   小張 f = (小張)sender;
   Console.WriteLine("小張的錢: " + f.錢.ToString());
   Console.WriteLine("開始扣錢......");
   System.Threading.Thread.Sleep(500);
   f.錢 = f.錢 - 500;
   Console.WriteLine("扣完了....現(xiàn)在小張還剩下:" + f.錢.ToString());
  }
 }

 // 如果玩游戲,則引發(fā)事件
 public class 小張
 {
  // 先定義一個(gè)事件,這個(gè)事件表示“小張”在玩游戲。
  public event PlayGameHandler PlayGame;
  // 保存小張錢的變量
  private int m_Money;

  public 小張()
  {
   Console.WriteLine("生成小張....");
   m_Money = 1000; // 構(gòu)造函數(shù),初始化小張的錢。
  }

  public int 錢 // 此屬性可以操作小張的錢。
  {
   get
   {
    return m_Money;
   }
   set
   {
    m_Money = value;
   }
  }

  public void 玩游戲()
  {
   Console.WriteLine("小張開始玩游戲了.....");
   Console.WriteLine("小張:CS好玩,哈哈哈! 我玩.....");
   System.Threading.Thread.Sleep(500);
   System.EventArgs e = new EventArgs();
   OnPlayGame(e);
  }

  protected virtual void OnPlayGame(EventArgs e)
  {
   if(PlayGame != null)
   {
    PlayGame(this,e);
   }
  }
 }

 // 定義委托處理程序
 public delegate void PlayGameHandler(object sender,System.EventArgs e);

}