C#中的委托Delegate
一、概述
委托為引用類型
二、使用
1、聲明委托類型,定義委托
public delegate void HandlerDelegate(string message);
2、聲明委托變量
HandlerDelegate myDelegate;//聲明委托變量
3、實(shí)例化委托,帶函數(shù)引用
傳統(tǒng)方式
//myDelegate = new HandlerDelegate(Method1);//可以為靜態(tài)方法或者實(shí)例方法。 //或者直接myDelegate = Method1;
方法定義:
public void Method1(string mgs) { Console.WriteLine(mgs); }
或匿名方法方式:
myDelegate = delegate (string message)//實(shí)例化委托(帶函數(shù)引用) { Console.WriteLine(message); };
或lambda表達(dá)式方式:
myDelegate = (message) => { Console.WriteLine(message); };
4、調(diào)用委托
myDelegate("Hello World");//同步調(diào)用
三、高級(jí)用法
1、多播委托
public delegate void HandlerDelegate(string message); void Main() { HandlerDelegate myDelegate;//聲明委托變量 myDelegate = (message) => { Console.WriteLine("a " + message); }; myDelegate += (message) => { Console.WriteLine("b " + message); }; myDelegate += (message) => { Console.WriteLine("c " + message); }; myDelegate("Hello World");//多個(gè)方法依次調(diào)用 Console.WriteLine(myDelegate.GetInvocationList().GetLength(0));//3 }
2、作為方法的參數(shù)傳遞委托實(shí)例
public delegate void HandlerDelegate(string message); //客戶端 void Main() { HandlerDelegate myDelegate;//聲明委托變量 myDelegate = (message) => { Console.WriteLine("計(jì)算結(jié)果為:" + message); }; MyClass myClass = new MyClass(); myClass.MethodWithCallback(2, myDelegate); } //作為服務(wù)端,計(jì)算完成后,將結(jié)果返回給客戶端 public class MyClass { public void MethodWithCallback(int a, HandlerDelegate callback) { a = a + 1; callback("result:" + a.ToString());//執(zhí)行委托 } }
四、同步、異步調(diào)用
1、委托的同步調(diào)用
委托的Invoke方法用來同步調(diào)用,它將阻塞當(dāng)前線程,然后執(zhí)行調(diào)用線程,調(diào)用完畢后再繼續(xù)主線程向下執(zhí)行。
public delegate int AddHandler(int a, int b); void Main() { AddHandler handler = (a, b) => { return (a + b); }; //int result = handler(2, 3); int result = handler.Invoke(2, 3);//此句調(diào)用的方法執(zhí)行完畢后才執(zhí)行往下的語句。 Console.Write(result);//5 }
2、委托的異步調(diào)用
把調(diào)用放入線程池中,程序主體線程或UI線程可同時(shí)執(zhí)行。
public delegate int AddHandler(int a, int b); void Main() { AddHandler handler = (a, b) => { return (a + b); }; IAsyncResult ar = handler.BeginInvoke(2, 3, null, null); //while (!ar.IsCompleted) //{ // Console.WriteLine("Do Sth.");//在委托的工作未完成之前,主線程可做其他事情。 //} //或 while (!ar.AsyncWaitHandle.WaitOne(0, false)) { Console.WriteLine("Do Sth."); } int result = handler.EndInvoke(ar); Console.Write(result);//5 }
3、委托的異步回調(diào)
public delegate int AddHandler(int a, int b); void Main() { AddHandler handler = (a, b) => { return (a + b); }; IAsyncResult ar = handler.BeginInvoke(2, 3, new AsyncCallback(AddComplete), null); Console.WriteLine("Do Sth.");//異步調(diào)用完成時(shí)調(diào)用此方法。 } public void AddComplete(IAsyncResult ar) { AddHandler handler = ((AsyncResult)ar).AsyncDelegate as AddHandler; Console.WriteLine(handler.EndInvoke(ar)); }
到此這篇關(guān)于C#委托的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法
這篇文章主要介紹了基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法,是應(yīng)用非常廣泛,需要的朋友可以參考下2014-08-08C# 刪除數(shù)組內(nèi)的某個(gè)值、一組值方法詳解
在本篇文章里小編給大家整理的是關(guān)于C# 如何刪除數(shù)組內(nèi)的某個(gè)值、一組值的相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2020-03-03C# 常用協(xié)議實(shí)現(xiàn)模版及FixedSizeReceiveFilter示例(SuperSocket入門)
本文主要介紹了常用協(xié)議實(shí)現(xiàn)模版及FixedSizeReceiveFilter示例。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法
這篇文章主要介紹了C#遍歷文件夾及其子目錄的方法,涉及C#文件與目錄的基本操作技巧,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06C#日期時(shí)間類的使用方法(DateTime類、TimeSpan類與DateTimeOffset類)
在C#中我們常使用到關(guān)于時(shí)間的相關(guān)操作,這篇文章主要給大家介紹了關(guān)于C#日期時(shí)間類的使用方法,文中介紹的方法分別包括DateTime類、TimeSpan類與DateTimeOffset類的相關(guān)資料,需要的朋友可以參考下2023-11-11c#中string的特性介紹及注意事項(xiàng)小結(jié)
這篇文章主要給大家介紹了關(guān)于c#中string的特性介紹及注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05C#使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間
這篇文章主要為大家詳細(xì)介紹了C#如何使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-01-01