程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我眼中委托的真正面貌(一)(1)

我眼中委托的真正面貌(一)(1)

編輯:關於C語言

首先我們以書中所介紹的委托的由來為起始點展開話題:

在C或C++中有時為了開啟一個子線程,我們會用到如下的方法:

HANDLE hThread;

DWord ThreadID;

hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);

以上語句中的ThreadFunc()為C++中的一個全局方法。因為C++或者C語言都是允許面向過程的,因此全局函數是可以存在的。但大家不妨試想一下,如果是C#或者Java這種純面向對象的語言,我們要怎麼做呢?

思考一下,在C#中你可以用如下的代碼來實現相同的效果嗎?

Tread subTread = new Tread();

subTread.Start(EntryPoint);

這樣做是明顯不對的!在C++中函數名EntryPoint實際上就是一個全局函數指針,它表明了子線程的入口地址。然而,在C#中這樣的情況是絕對不存在的!原因很簡單——作為一門面向對象的語言,C#中很少有方法是獨立於對象而存在的。

在C#中調用方法時,這些方法通常都要與一個類的實例相關聯。也就是說,如果要傳遞一個方法,那麼就必須把該方法的相關細節包裝在一種新型的對象中。於是,伴隨著這種需要,委托隨之誕生。

以上只是《C#高級編程》一書中所提到的委托的產生過程,在這裡我並不想深究其中的機制,而是以此為線索,深層次的挖掘C#中委托的實質用途及其優勢所在。

這樣一來,首先單純根據委托的定義可知,委托可以簡單的包裝方法的細節:

1.簡單的包裝方法

namespace SimpleDelegate

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

       //定義委托

        private delegate void MyDelegete();

       //聲明委托的實例變量,並為其掛載相應的方法

        private MyDelegete MyObjdelegate = new MyDelegete(MyFun);

        private void button1_Click(object sender, EventArgs e)

        {

            MyObjdelegate();

        }

        static private void MyFun()

        {

            MessageBox.Show("委托掛載的事件調用成功!");

        }

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved