.Net中事件與委託的樣本詳細解

來源:互聯網
上載者:User

比如說一個公司(情境),你是老闆,手下有兩個員工,小張和小王。
你命令小王,如果小張玩遊戲,則小王扣去小張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);

}

其中:
扣錢事件中: 
小張 f = (小張)sender;

這個代碼錶示讓小王扣小張的錢,那麼,小王扣錢的時候,必須要操作小張的對象執行個體。
如果大家仔細看代碼,就會明白,在小王扣錢的方法裡面:
public void 扣錢(object sender,EventArgs e)
方法參數裡面有個object sender對象,這個對象表示激發事件的對象,在這個程式裡面就表示這個sender其實是小張,但是傳遞的物件類型是object,所以必須使用物件類型轉換語句把sender從object轉成小張,所以有了:
小張 f = (小張)sender;

System.Threading.Thread.Sleep(500);
這個代碼是讓程式暫停半秒鐘,500的單位是毫秒,500毫秒就是半秒。

在小張類裡面,有一行代碼
protected virtual void OnPlayGame(EventArgs e)
含義就是測試這個PlayGame事件是否已經被其他對象註冊。因為小張類的PlayGame事件有可能沒有其他類通知需要處理,那麼這個代碼:
 if(PlayGame != null)
就探測沒有對象需要發送事件通知,否則表示已經有對象需要處理這個事件,就發送事件通知,讓對象進行處理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.