最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#基礎(chǔ)之委托用法實(shí)例教程

 更新時(shí)間:2014年09月06日 10:11:40   投稿:shichen2014  
這篇文章主要介紹了C#中委托的用法,包括委托的功能、定義及用法示例,需要的朋友可以參考下

本文以實(shí)例形式簡(jiǎn)單介紹了C#中委托的用法,是深入學(xué)習(xí)C#程序設(shè)計(jì)所必須掌握的重要技巧?,F(xiàn)以教程形式分享給大家供大家參考之用。具體如下:

首先,委托是C#中最為常見(jiàn)的內(nèi)容。與類(lèi)、枚舉、結(jié)構(gòu)、接口一樣,委托也是一種類(lèi)型。類(lèi)是對(duì)象的抽象,而委托則可以看成是函數(shù)的抽象。一個(gè)委托代表了具有相同參數(shù)列表和返回值的所有函數(shù)。比如:

delegate int GetCalculatedValueDelegate(int x, int y);

在上面的定義中,我們定義了一個(gè)委托,這個(gè)委托代表著一類(lèi)函數(shù),這些函數(shù)的第一個(gè)參數(shù)是整數(shù)型的x,第二個(gè)參數(shù)是整數(shù)型的y,而函數(shù)的返回值則是一個(gè)整數(shù)。在這里,為了描述方便,我們把這一類(lèi)的函數(shù)稱(chēng)為具有相同簽名(signature)的函數(shù)(注意:這個(gè)簽名并不是數(shù)字簽名中的概念,而只是表示這類(lèi)函數(shù)具有相同的參數(shù)列表和返回值)。

既然委托是一種類(lèi)型,那么它就能被用來(lái)定義參數(shù)、變量以及返回值。由委托定義的變量用于保存具有相同簽名的函數(shù)實(shí)體。需要注意的是,C#和C++不同,C++中的函數(shù)指針只能保存全局的或者靜態(tài)的函數(shù),而C#中的委托實(shí)體則可以指代任何函數(shù)。

現(xiàn)在我們來(lái)看一個(gè)例子,在這個(gè)例子中,我們使用了上面定義的那個(gè)委托,并創(chuàng)建了一個(gè)委托實(shí)體,使其指代程序中的AddCalculator函數(shù),接下來(lái)就可以直接像使用函數(shù)本身一樣,使用這個(gè)委托實(shí)體來(lái)獲得計(jì)算的結(jié)果。

delegate int GetCalculatedValueDelegate(int x, int y); 
 
static int AddCalculator(int x, int y) 
{ 
 return x + y; 
} 
 
static int SubCalculator(int x, int y) 
{ 
 return x - y; 
} 
 
static void Main(string[] args) 
{ 
 GetCalculatedValueDelegate d = AddCalculator; 
 Console.WriteLine(d(10, 20)); 
}

到這里也就能基本上明白“委托”的意義了,針對(duì)上面的Main函數(shù),本來(lái)需要調(diào)用AddCalculator函數(shù)的,卻通過(guò)d來(lái)調(diào)用了,也就是,后續(xù)對(duì)AddCalculator的操作由d代為效勞。本來(lái)是要小明去老師辦公室拿粉筆盒的,由于小明和小文是好朋友,因此小明就要小文代他去拿,于是小文成了小明的代理,小明委托小文去拿粉筆盒。

現(xiàn)在我們來(lái)考慮委托作為參數(shù)的情形。將委托作為參數(shù),可以把函數(shù)本身的處理邏輯抽象出來(lái),而讓調(diào)用者決定最終使用什么樣的邏輯去處理。請(qǐng)看下面的例子:

delegate int GetCalculatedValueDelegate(int x, int y); 
 
static int AddCalculator(int x, int y) 
{ 
 return x + y; 
}
 
static int SubCalculator(int x, int y) 
{ 
 return x - y; 
} 
 
static int Calculator(GetCalculatedValueDelegate del, int x, int y) 
{ 
 return del(x, y); 
} 
 
static void Main(string[] args) 
{ 
 Console.WriteLine(Calculator(AddCalculator, 10, 20)); 
}

在上面的例子中,Calculator函數(shù)的第一個(gè)參數(shù)就是一個(gè)委托。事實(shí)上,Calculator對(duì)x和y將會(huì)做什么處理,它本身并不知道,如何處理x和y由GetCalculatedValueDelegate來(lái)決定。那么在Main方法里,我們將AddCalculator方法作為參數(shù)傳遞給Calculator,表示讓Calculator用AddCalculator的邏輯去處理x和y。這也很形象:Calculator說(shuō):“我不知道要怎么處理x和y,讓del去處理好了!”于是就把x和y扔給了del。

這種做法其實(shí)跟“模板方法模式”有點(diǎn)點(diǎn)類(lèi)似。在模板方法模式中,可以將可變的部分留給子類(lèi)去重寫(xiě),而將不變的部分由父類(lèi)實(shí)現(xiàn)。那么在委托作為參數(shù)的情況下,Calculator可以自己處理不變的邏輯,而將“具體怎么做”的事情委托給他人去辦理。

委托作為參數(shù),在C#中非常常見(jiàn)。比如線(xiàn)程的創(chuàng)建,需要給一個(gè)ThreadStart或者ParameterizedThreadStart委托作為參數(shù),而在線(xiàn)程執(zhí)行的時(shí)候,將這個(gè)參數(shù)所指代的函數(shù)用作線(xiàn)程執(zhí)行體。再比如:List<T>類(lèi)型的Find方法的參數(shù)也是一個(gè)委托,它把“怎么去查找”或者說(shuō)“怎么樣才算找到”這個(gè)問(wèn)題留給了開(kāi)發(fā)人員。開(kāi)發(fā)人員只需要定義一個(gè)參數(shù)為T(mén),返回值為布爾型的函數(shù),實(shí)現(xiàn)函數(shù)體,并將函數(shù)作為參數(shù)傳給Find方法,就可以完成集合中元素的查找。

委托作為返回值一般會(huì)用在“根據(jù)不同情況決定使用不同的委托”這樣的情形下。這有點(diǎn)像工廠模式,不過(guò)委托用作返回值還是用的沒(méi)有用作參數(shù)這樣頻繁。

與委托相關(guān)的概念還有很多,比如異步調(diào)用、泛型委托、匿名方法、Lambda表達(dá)式、事件、協(xié)變與逆變等。感興趣的讀者可以查看本站相關(guān)文章。

相關(guān)文章

  • C#實(shí)現(xiàn)注冊(cè)碼的方法

    C#實(shí)現(xiàn)注冊(cè)碼的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)注冊(cè)碼的方法,可實(shí)現(xiàn)C#生成軟件注冊(cè)碼的相關(guān)功能,涉及C#硬件操作及隨機(jī)數(shù)操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#實(shí)現(xiàn)軟件開(kāi)機(jī)自啟動(dòng)的示例代碼

    C#實(shí)現(xiàn)軟件開(kāi)機(jī)自啟動(dòng)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)軟件開(kāi)機(jī)自啟動(dòng),且不需要管理員權(quán)限,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-07-07
  • C#實(shí)現(xiàn)JSON和對(duì)象之間互相轉(zhuǎn)換功能示例

    C#實(shí)現(xiàn)JSON和對(duì)象之間互相轉(zhuǎn)換功能示例

    這篇文章主要介紹了C#實(shí)現(xiàn)JSON和對(duì)象之間互相轉(zhuǎn)換功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了C#實(shí)現(xiàn)對(duì)象與json之間相互轉(zhuǎn)換的操作技巧,需要的朋友可以參考下
    2017-09-09
  • C#判斷訪問(wèn)來(lái)源是否為搜索引擎鏈接的方法

    C#判斷訪問(wèn)來(lái)源是否為搜索引擎鏈接的方法

    這篇文章主要介紹了C#判斷訪問(wèn)來(lái)源是否為搜索引擎鏈接的方法,實(shí)例分析了C#解析URL來(lái)源的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 淺談C#泛型的用處與特點(diǎn)

    淺談C#泛型的用處與特點(diǎn)

    泛型是 2.0 版 C# 語(yǔ)言和公共語(yǔ)言運(yùn)行庫(kù) (CLR) 中的一個(gè)新功能。泛型將類(lèi)型參數(shù)的概念引入 .NET Framework,類(lèi)型參數(shù)使得設(shè)計(jì)如下類(lèi)和方法成為可能:這些類(lèi)和方法將一個(gè)或多個(gè)類(lèi)型的指定推遲到客戶(hù)端代碼聲明并實(shí)例化該類(lèi)或方法的時(shí)候
    2013-09-09
  • C#實(shí)現(xiàn)標(biāo)題閃爍效果的示例代碼

    C#實(shí)現(xiàn)標(biāo)題閃爍效果的示例代碼

    在Windows系統(tǒng)中,當(dāng)程序在后臺(tái)運(yùn)行時(shí),如果某個(gè)窗體的提示信息需要用戶(hù)瀏覽,該窗體就會(huì)不停地閃爍,這樣就會(huì)吸引用戶(hù)的注意,下面我們就來(lái)看看如何使用C#實(shí)現(xiàn)這一效果吧
    2024-04-04
  • C# 設(shè)計(jì)模式系列教程-橋接模式

    C# 設(shè)計(jì)模式系列教程-橋接模式

    橋接模式降低了沿著兩個(gè)或多個(gè)維度擴(kuò)展時(shí)的復(fù)雜度,防止類(lèi)的過(guò)度膨脹,解除了兩個(gè)或多個(gè)維度之間的耦合,使它們沿著各自方向變化而不互相影響。
    2016-06-06
  • 簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù)

    簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù)

    這篇文章主要介紹了簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C#顯示文件夾下所有圖片文件的方法

    C#顯示文件夾下所有圖片文件的方法

    這篇文章主要介紹了C#顯示文件夾下所有圖片文件的方法,涉及C#操作圖片文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C# Aspose.Words 刪除word中的圖片操作

    C# Aspose.Words 刪除word中的圖片操作

    這篇文章主要介紹了C# Aspose.Words 刪除word中的圖片操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論

克山县| 延庆县| 沙坪坝区| 双鸭山市| 札达县| 六安市| 鹤峰县| 兴业县| 金山区| 慈溪市| 云安县| 徐汇区| 济源市| 彰化县| 日照市| 梁河县| 平湖市| 南丰县| 若羌县| 全椒县| 安康市| 仙桃市| 遂宁市| 会泽县| 温泉县| 武胜县| 开封市| 邯郸市| 左云县| 镇宁| 乐都县| 健康| 汉寿县| 海伦市| 望都县| 扶沟县| 望奎县| 蓬溪县| 讷河市| 武功县| 渝北区|