C#3.0筆記(一)預備知識之Delegate

來源:互聯網
上載者:User

在學習C#3.0之前還是先來回顧下委託、事件,因為這樣能更加有助於理解 C#3.0裡面的一些新的特性,如Lambada運算式等。

背景

在C語言 中我們可以用函數指標來建立回呼函數,但是在C裡面回呼函數存在一些安全問 題。因為它只是在記憶體位址中記錄了下來,並沒有像方法的參數類型、參數個數 、傳回值等其他安全資訊。而在.Net FrameWork中,回調仍然是可以的,.net framework中提供了更為進階的更為安全的物件導向的delegate來實現。

定義委託

在委託中主要包含了三個重要的資訊:

1.調用的方法的 名稱;

2.方法的參數;

3.方法的傳回值。

定義一個簡單 的委託:

public delegate int Caculate(int x,int y)

這樣的委託就是簽名了參數為兩個int類型傳回值為int類型的參 數,Caculate類型的對象可以在運行時動態地調用其指向的方法。要注意的 是.net委託既可以指向動態方法也可以指向靜態方法。

C#編譯器在 處理delegate的時候,它會先自動產生一個繼承於System.MulticastDelegate的 類。正是這樣的類根System.Delegate為委託提供了必要的基礎資訊,以便來維 護需要調用的方法列表。我們可以通過IL查看器看到:

產生的Caculate類中定義了三個方法:BeginInvoke、EndInvoke、Invoke。其 中Invoke是核心的方法,它用來以同步的方式調用委託列表中的每個方法。我們 可以看一看編譯器是如何定義這幾個方法的。Invoke方法中的參數跟傳回值完全 跟Caculate委託的定義一樣的,而BeginInvoke中多了兩個參數一個是 AsyncCallback類型的一個是object類型的,EndInvoke方法返回Int類型。

通過MulticastDeletate跟Delegate基類擷取更多資訊

我通過上 面的IL代碼也可以看到編譯器產生委託時的類是繼承於MulticastDelegate的, 而MulticastDelegate繼承於Delegate類,所以可以通過這兩個類來擷取委託更 多的輔助資訊。在這裡只列出一些常用的屬性和方法,可以在msdn上擷取更多地 這兩個類的內容(MulticastDelegate成員)。

1.Methos屬性:返回 System.Reflection.MethodInfo類型,描述委託所表示的方法資訊。

2.Target屬性:返回委託方法所在的對象,如果是靜態方法即返回null。

3.GetInvocationList方法:返回一個Delegate類型的數組,其中數組的 每個元素表示一個可以調用的方法。

4.Combine方法: 靜態方法用來給委 托添加一個方法。

5.Remove方法:靜態方法給委託移除某個方法。

相關文章

聯繫我們

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