C#中的委托Delegate
一、概述
委托為引用類型
二、使用
1、聲明委托類型,定義委托
public delegate void HandlerDelegate(string message);
2、聲明委托變量
HandlerDelegate myDelegate;//聲明委托變量
3、實例化委托,帶函數(shù)引用
傳統(tǒng)方式
//myDelegate = new HandlerDelegate(Method1);//可以為靜態(tài)方法或者實例方法。 //或者直接myDelegate = Method1;
方法定義:
public void Method1(string mgs) { Console.WriteLine(mgs); }
或匿名方法方式:
myDelegate = delegate (string message)//實例化委托(帶函數(shù)引用) { Console.WriteLine(message); };
或lambda表達式方式:
myDelegate = (message) => { Console.WriteLine(message); };
4、調(diào)用委托
myDelegate("Hello World");//同步調(diào)用
三、高級用法
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");//多個方法依次調(diào)用 Console.WriteLine(myDelegate.GetInvocationList().GetLength(0));//3 }
2、作為方法的參數(shù)傳遞委托實例
public delegate void HandlerDelegate(string message); //客戶端 void Main() { HandlerDelegate myDelegate;//聲明委托變量 myDelegate = (message) => { Console.WriteLine("計算結(jié)果為:" + message); }; MyClass myClass = new MyClass(); myClass.MethodWithCallback(2, myDelegate); } //作為服務(wù)端,計算完成后,將結(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線程可同時執(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)用完成時調(diào)用此方法。 } public void AddComplete(IAsyncResult ar) { AddHandler handler = ((AsyncResult)ar).AsyncDelegate as AddHandler; Console.WriteLine(handler.EndInvoke(ar)); }
到此這篇關(guān)于C#委托的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# 刪除數(shù)組內(nèi)的某個值、一組值方法詳解
在本篇文章里小編給大家整理的是關(guān)于C# 如何刪除數(shù)組內(nèi)的某個值、一組值的相關(guān)知識點,需要的朋友們學(xué)習(xí)下。2020-03-03C# 常用協(xié)議實現(xiàn)模版及FixedSizeReceiveFilter示例(SuperSocket入門)
本文主要介紹了常用協(xié)議實現(xiàn)模版及FixedSizeReceiveFilter示例。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01C#日期時間類的使用方法(DateTime類、TimeSpan類與DateTimeOffset類)
在C#中我們常使用到關(guān)于時間的相關(guān)操作,這篇文章主要給大家介紹了關(guān)于C#日期時間類的使用方法,文中介紹的方法分別包括DateTime類、TimeSpan類與DateTimeOffset類的相關(guān)資料,需要的朋友可以參考下2023-11-11C#使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間
這篇文章主要為大家詳細介紹了C#如何使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-01-01