.Net常見(jiàn)問(wèn)題之C#中的委托
有朋友說(shuō)委托和C++中的函數(shù)指針很像,但是兩者真的有差別。在C++中,函數(shù)指針不是類型安全的,它所指向的是內(nèi)存中的某一個(gè)位置,但是我們沒(méi)有辦法判斷這個(gè)指針實(shí)際指向的是什么,對(duì)于參數(shù)和返回類型更難以判斷了。但是.NET中的委托則完全不同,它是類型比較安全的類,我們很明白的知道委托定義的返回類型和參數(shù)類型。它不僅包含了方法的引用,而且包含了方法的引用。下面通過(guò)一段代碼給大家分享下對(duì)委托的理解:
什么是委托
在實(shí)際的開(kāi)發(fā)過(guò)程中,有時(shí)某個(gè)方法執(zhí)行的操作并不是針對(duì)數(shù)據(jù)進(jìn)行的,而是針對(duì)另一個(gè)方法,但是這個(gè)方法在編譯時(shí)又無(wú)法得知,只能在運(yùn)行時(shí)才知道。如果是針對(duì)數(shù)據(jù)做操作,只需將數(shù)據(jù)作為方法的參數(shù)傳入即可,那么針對(duì)方法做操作,很明顯將方法作為參數(shù)傳入即可,聽(tīng)起來(lái)的確很奇怪,但是需要先接受這個(gè)現(xiàn)實(shí),然后從使用中去體會(huì)它的含義。下面舉一個(gè)例子(請(qǐng)?jiān)徫业挠⒄Z(yǔ) ,my english is poor?。?,這樣一個(gè)場(chǎng)景:媒婆給菇?jīng)龌蛘咝』锝榻B對(duì)象,如果是對(duì)象是男的,菇?jīng)鼍驼f(shuō)出她的聯(lián)系方式,如果是女的,小伙就說(shuō)出他的聯(lián)系方式(PS:我們這里都是正常的性取向)。
看一下代碼圖
在命名空間里,定義一個(gè)委托,和類是平級(jí)的
public delegate string GetTelphone();
概述中提到,委托可以定義返回類型和參數(shù)類型,那么這個(gè)委托的返回類型就是string,無(wú)參的。
繼續(xù)。。。。
媒婆類:
/// <summary> /// 媒婆 /// </summary> class MeiPo { public string Sex { get; set; } public void GetTel(GetTelphone getTelphone) { Console.WriteLine(getTelphone.Invoke()); } }
可以看到,GetTel方法的參數(shù)是一個(gè)委托類型的,和一般的基本類型和常見(jiàn)引用類型引用方式一樣使用。然后再方法體執(zhí)行委托方法,輸出結(jié)果。
菇?jīng)鲱悾?/strong>
/// <summary> /// 菇?jīng)? /// </summary> class Girl { public string GetGirlTel() { return "得到菇?jīng)龅碾娫?; } }
小伙類:
/// <summary> /// 男屌絲 /// </summary> class DiaoSi { public string GetBoyTel() { return "得到男屌絲的電話"; } }
最后上測(cè)試類
static void Main(string[] args) { var redMun = new MeiPo {Sex = "男"}; var del= new GetTelphone(new Girl().GetGirlTel); if(redMun.Sex=="女") del = new GetTelphone(new DiaoSi().GetBoyTel); redMun.GetTel(del); Console.ReadKey(); }
執(zhí)行步驟:
1、創(chuàng)建媒婆對(duì)象,媒婆介紹一個(gè)sex="男",
2、創(chuàng)建委托對(duì)象,委托是一個(gè)類,所以用new來(lái)實(shí)例化。委托即指方法的引用,所在初始化時(shí)傳入指向的方法引用new Girl().GetGrilTel
3、如果媒婆介紹的是sex="女",那么委托指向另一個(gè)方法
4、媒婆對(duì)象調(diào)用GetTel得到聯(lián)系方式
以上內(nèi)容就是對(duì)委托介紹的全部?jī)?nèi)容,希望大家喜歡。
相關(guān)文章
解決C#程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法詳解
本篇文章是對(duì)C#中程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05淺談C#中ToString()和Convert.ToString()的區(qū)別
本文介紹了ToString()和Convert.ToString()的使用方法,他們之間的區(qū)別,以及從object到string的轉(zhuǎn)換方法,希望對(duì)學(xué)習(xí)C#編程的你有所幫助2016-11-11C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式
這篇文章介紹了C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Unity實(shí)現(xiàn)簡(jiǎn)單的虛擬搖桿
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單的虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04UGUI實(shí)現(xiàn)隨意調(diào)整Text中的字體間距
這篇文章主要為大家詳細(xì)介紹了UGUI實(shí)現(xiàn)隨意調(diào)整字體間距的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Unity?UGUI的PhysicsRaycaster物理射線檢測(cè)組件介紹使用
這篇文章主要介紹了Unity?UGUI的PhysicsRaycaster物理射線檢測(cè)組件的介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07C# Guid長(zhǎng)度雪花簡(jiǎn)單生成器的示例代碼
這篇文章主要介紹了C# Guid長(zhǎng)度雪花簡(jiǎn)單生成器的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12.net(c#)中的new關(guān)鍵字詳細(xì)介紹
在 C# 中,new 關(guān)鍵字可用作運(yùn)算符、修飾符或約束2013-10-10C#從數(shù)據(jù)庫(kù)讀取圖片并保存的兩種方法
這篇文章主要介紹了C#從數(shù)據(jù)庫(kù)讀取圖片并保存的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01