1. 程式人生 > >一個.NET委託的入門例子

一個.NET委託的入門例子

有許多人問的,.Net中的委託以及事件處理。我拿簡單的例子說明一下,是現實中的例子:

比如說一個公司(場景),你是老闆,手下有兩個員工,小張和小王。

你命令小王,如果小張玩遊戲,則小王扣去小張500元錢。

這就是現實中的委託。


實際上,在寫程式中,程式設計師就是老闆,小張和小王就是兩個物件。小張玩遊戲是一個方法,小張還有一個遊戲事件,他玩遊戲激發這個事件。而小王就是事件處理物件,他負責把小張的錢扣除500。

所以,委託有如下幾個要素:

1 激發事件的物件--就是小張

2 處理物件事件的物件--就是小王

3 定義委託,就是你讓小王監視小張。

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


下面有個例子:在vs.net2003 C#控制檯應用程式編輯執行成功:

using System;

namespace CSharpConsole
{

  public class 場景
  {
  [STAThread]
  public static void Main(string[] args)
  {
  Console.WriteLine("場景開始了....");

  // 生成小王

  小王 w = new 小王();

  // 生成小賬

  小張 z = new 小張();

  // 指定監視

  z.PlayGame += new PlayGameHandler(w.扣錢);

  // 開始玩遊戲

  z.玩遊戲();

  console.writeline("場景結束...");

  Console.ReadLine();

  }

  }

  // 負責扣錢的人

  public class 小王
  {

  public 小王()
  {

  Console.WriteLine("生成小王...");

  }

  public void 扣錢(object sender, EventArgs e)
  {

  Console.WriteLine("小王:好小子,上班時間膽敢玩遊戲...");

  Console.WriteLine("小王:看看你小子有多少錢...");

  小張 f = (小張)sender;

  Console.WriteLine("小張的錢: " + f.錢.ToString());

  Console.WriteLine("開始扣錢......");

  System.Threading.Thread.Sleep(500);

  f.錢 = f.錢 - 500;

  Console.WriteLine("扣完了....現在小張還剩下:" + f.錢.ToString());

  }

  }

  // 如果玩遊戲,則引發事件

  public class 小張
  {

  // 先定義一個事件,這個事件表示“小張”在玩遊戲。

  public event PlayGameHandler PlayGame;

  // 儲存小張錢的變數

  private int m_Money;

  public 小張()
  {

  Console.WriteLine("生成小張....");

  m_Money = 1000; // 建構函式,初始化小張的錢。

  }

  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);

}