c#委託–應用

來源:互聯網
上載者:User

委託應該是c#裡面比較難理解的方面之一,所以成為很多專案經理面試員工的常問問題,下面是從網上看到的一篇文章,寫的不錯很形象,所以引過來,然後在說明一下委託的用處。

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

}

 

 

實際上,委託的原理是擷取一個表單的控制代碼(表單的指標),通過表單的指標調用其方法,c#封裝了c++的指標,使其更加安全和簡單,但是指標封裝了帶來有些問題無法處理,於是出現了委託的概念。

我所用到的委託有兩個方面:

(1)一個表單(父表單)中彈出另一個表單(子表單),子表單中的事件觸發父表單的函數;如,從父表單中彈出一個設定表單,設定完畢點擊ok按鈕後,重新整理父表單。

(2)一個表單(父表單)中彈出另兩個表單(子表單1和子表單2),子表單1中的事件觸發子表單2中的函數;如,應用多文檔表單時候,一個子表單中選擇改變在另一個表單中有所反映。

第一種方式:代碼如下:

子表單代碼:

 public delegate void PlayGameHandler(int i);
        public event PlayGameHandler shijian;

        private void FormSon_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            shijian(4);
        }

父表單代碼:

 

 private void FormParent_Load(object sender, EventArgs e)
        {
            FormSon fs = new FormSon();
            fs.shijian += new FormSon.PlayGameHandler(fs_shijian);
            fs.Show();
        }

        void fs_shijian(int i)
        {
            MessageBox.Show(i.ToString());
        }

ok,這樣當在子表單中單擊按鈕,父表單會彈出訊息框。

第二種應用使用上面的方式可以解決。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.