程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 談談C#中的Deegate

談談C#中的Deegate

編輯:.NET實例教程
        本人現在長期從事於.Net下的開發,因為工作的關系,間斷的做過一些C++,DELPHI的程序,對後兩者的程序語言有一定的了解,因此在平時也經常遇 到有人問我關於C#和另外兩種語言相比有哪些特點。我所了解的其中很大一個特點就是C#裡沒有指針,所有的對象全部通過引用來該問。引用的類型之間不能隨 便進行轉換,避免了程序運行過程中出現的轉換可能發生的問題(例如把一個整型轉成一個指針進行訪問等類似的潛在危險)。普能對象可以通過指針來引用,可是 對於C++,DELPHI中的函數指針作為參數傳送這樣的函數調用形式在C#裡面又應該怎麼來表示呢。答案就是Delegate。同C++/Delphi 用函數指針來實現事件(Event)和回調函數類似,在C#中是通過Delegate來實現。

       首先來看看Delegate的中文句稱是什麼,網上找得到的翻譯有好幾種名稱,委托、委派、指派,代理等。個人理解:“代理”好像是個專有名稱,在設計模 式和分層開發中有特定的含意,容易引起誤解;“指派”,“委派”有點象個動詞,不適合來命名,讀起來總覺得那麼別扭,好像港台地區用得比較多一點;“委 托”讀起來感覺有點文皺皺的,但是 MSDN的官方翻譯是“委托”,沒辦法,誰叫MSDN比較權威呢,在沒有找到更好的名稱之前,我還是比較傾向於使用“委托”這個名稱的,所以以下內容均采 用這一中文命名。

      再來說說委托本身吧,在C#裡面委托不再是像C++/Delphi那樣就是一個簡單的整型值,而且一個有著復雜內部邏輯的數據結構體,具體的來說就是一個 類(class),只不過這個類有點特殊,個人感覺有點像重載了()運算符的C++類對象,只不過C++類中重載()運算符只是它的一個附加功能,而C# 中委托只能用於作函數的封裝,調用。

// 聲明一個委托
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);

        在定義的時候不是像普通類那樣能夠再聲明內部數據,函數等;在聲明的時候沒有基類的聲明,所有的委托都隱式的從 MulticastDelegate(繼承自Delegate) 這個抽象的基類繼承下來;所有的聲明的委托都自動是sealed的,不能夠再次被繼承;實例化一個委托的時候只能夠指定一個函數名作為參數(這也是可以理 解的,委托嘛,最初設計的目的就是用來包裝函數的);C#裡的委托和C++/DELPHI最大的不同就是既可以傳遞靜態函數,也可以傳遞非靜態函數,沒有 試過能不能傳遞extern的函數,因為extern的函數都可以用一個靜態函數再傳遞調用一下。如果有誰試過,告請告知一下結果(雖然Delphi裡面 有一種函數指針是在普通函數指針的聲明後面加上 of object可以變成指向類成員函數的指會,但是在形式上這兩種函數指針類型不能像C#那樣完美的統一在一起)。這都得益於委托是個數據結構體,可以有額 外的存儲區保存非靜態函數的實例對象的信息,通過委托對象的Target屬性可以訪問到,如果代表的是一個靜態函數的委托,該屬性值為null。不過這也 帶來了一些負面影響,使得很多從C#開始學編程的人在使用委托很長的時間裡都不知道引用實例成員函數和引用類的靜態函數在原理上是完全不一樣的,不知道為 什麼C++的回調函數都要聲明成靜態的或者不屬於任類的。

        與函數指針相比,委托是面向對象、類型安全、可靠的托管(Managed)對象。也就是說,CLR能夠保證委托指向一個有效的函數,你無須擔心委托會指向 無效地址或者越界地址。借用MSDN中的一句話-------由於它們與其他編程語言中所使用的函數指針相似,因此它們有時也被稱為“類型安全的函數指 針”。

       委托的比較。
       根據MSDN的說明,按照以下方式比較這些函數和目標是否相等:
    
     * 如果所比較的兩種函數都是靜態的且對同一類為同一函數,則這些函數被視為相等,這些目標也被視為相等。
     * 如果所比較的兩種函數都是實例函數且對同一個對象為同一種函數,則這些函數被視為相等,這些目標也被視為相等。
     * 否則,這些函數被視為不相等,這些目標也被視為不相等。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved