日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#3.0笔记(一)预备知识之Delegate

發(fā)布時間:2025/3/15 C# 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#3.0笔记(一)预备知识之Delegate 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

背景

在C語言中我們可以用函數(shù)指針來創(chuàng)建回調(diào)函數(shù),但是在C里面回調(diào)函數(shù)存在一些安全問題。因為它只是在內(nèi)存地址中記錄了下來,并沒有像方法的參數(shù)類型、參數(shù)個數(shù)、返回值等其他安全信息。而在.Net FrameWork中,回調(diào)仍然是可以的,.net framework中提供了更為高級的更為安全的面向?qū)ο蟮膁elegate來實現(xiàn)。

定義委托

在委托中主要包含了三個重要的信息:

1.調(diào)用的方法的名稱;

2.方法的參數(shù);

3.方法的返回值。

定義一個簡單的委托:

public delegate int Caculate(int x,int y)

這樣的委托就是簽名了參數(shù)為兩個int類型返回值為int類型的參數(shù),Caculate類型的對象可以在運行時動態(tài)地調(diào)用其指向的方法。要注意的是.net委托既可以指向動態(tài)的方法也可以指向靜態(tài)的方法。

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

?

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

通過MulticastDeletate跟Delegate基類獲取更多信息

?

我通過上面的IL代碼也可以看到編譯器生成委托時的類是繼承于MulticastDelegate的,而MulticastDelegate繼承于Delegate類,所以可以通過這兩個類來獲取委托更多的輔助信息。在這里只列出一些常用的屬性和方法,可以在msdn上獲取更多地這兩個類的內(nèi)容(MulticastDelegate成員)。

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

2.Target屬性:返回委托方法所在的對象,如果是靜態(tài)方法即返回null。

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

4.Combine方法: 靜態(tài)方法用來給委托添加一個方法。

5.Remove方法:靜態(tài)方法給委托移除某個方法。

看下簡單的Caculate的實現(xiàn),CaculateClient類:

public class CaculateClient{public int Add(int x, int y){return x + y;}public int Subtract(int x, int y){return x - y;}}

另外定義了一個輔助方法:

public static void DisplayDelegateInfo(Delegate del){foreach (Delegate d in del.GetInvocationList()){Console.WriteLine("Method Name:{0}", d.Method.Name);Console.WriteLine("Target is:{0}", d.Target);}}

調(diào)用:

static void Main(string[] args){CaculateClient caClient =new CaculateClient();Simple.Caculate ca = new Simple.Caculate(caClient.Add);Console.WriteLine("1+1={0}",ca(1,1));ca += new Simple.Caculate(caClient.Subtract);Console.WriteLine("Result:{0}", ca(1, 1));Simple.DisplayDelegateInfo(ca);Console.Read();}

我們可以看到下面的結(jié)果:

小結(jié)

現(xiàn)在我們基本上知道Delegate的原理,已經(jīng)基本的實現(xiàn),但是我們并沒有實現(xiàn)一些高級的話題,畢竟Caculate還只是一個玩具,呵呵。下一篇中將會涉及到多播、復雜點的示例以及事件

下一篇:C#3.0筆記(二)預備知識之委托與事件?

作者:Henllyee Cui
出處: http://henllyee.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明。

?

轉(zhuǎn)載于:https://www.cnblogs.com/Henllyee/archive/2009/04/05/1430028.html

總結(jié)

以上是生活随笔為你收集整理的C#3.0笔记(一)预备知识之Delegate的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。