最直白易懂的C#委託入門講解

作者:TomMax (笑望人生)     出處:csdn

主  題: “.net百題問答的活動”--許多人問過的--《 C#委託及事件 》

所屬論壇: .NET技術 C#

有許多人問的,.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);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章