網站首頁 編程語言 正文
1、什么是委托
從數據結構來講,委托是和類一樣是一種用戶自定義類型。
委托是方法的抽象,它存儲的就是一系列具有相同簽名和返回回類型的方法的地址。調用委托的時候,委托包含的所有方法將被執行。
2、委托的定義
委托是類型,就好像類是類型一樣。與類一樣,委托類型必須在被用來創建變量以及類型對象之前聲明。
委托的聲明原型是
delegate?<函數返回類型>?<委托名> (<函數參數>)
例子:public delegate void MyDelegate(int number);//定義了一個委托MyDelegate,它可以注冊返回void類型且有一個int作為參數的函數
3、委托的實例化
3.1 使用new關鍵字
委托實例化的原型是
<委托類型> <實例化名>=new <委托類型>(<注冊函數>)
例子:MyDelegate _MyDelegate=new MyDelegate(CheckMod);//用函數CheckMod實例化上面的MyDelegate 委托為_MyDelegate
3.2 使用匿名方法
<委托類型> <實例化名>=delegate(<函數參數>){函數體};
3.3 使用Lambda表達式
class Program { //聲明委托 delegate int MyDelegate(int x, int y); static void Main(string[] args) { //實例化委托 //1、使用new關鍵字 MyDelegate _myDelegate = new MyDelegate(GetSum); //2、使用匿名方法 MyDelegate myDelegate = delegate(int x, int y) { return x + y; }; //3、使用Lambda表達式 MyDelegate myDelegateLambda = (int x, int y) => { return x + y; }; } static int GetSum(int x, int y) { return x + y; } }
4、泛型委托
委托也支持泛型的使用
泛型委托原型:
delegate?
例如:delegate T2 DelegateDemo
static boo Check(int i) { if(i%2==0) { return true; } return false; } static void Main(string[] args) { DelegateDemo_delegate =Check;//將泛型委托委托 實例化為 ,即表示有一個int類型參數且返回類型是bool的函數. Console.WriteLine(_delegate(9));//false }
5、C#內置泛型委托
C#共有3種內置泛型委托
namespace DelegateDemo { class Program { //聲明委托 delegate int MyDelegate(int x, int y); static void Main(string[] args) { //1、Action只能委托必須是無返回值的方法 Action _action = new Action (SayHello); _action("Hello World"); //2、Fun 只是委托必須有返回值的方法 Func _func = new Func (Check); _func(5); //3、Predicate:此委托返回一個bool值,該委托通常引用一個"判斷條件函數"。 //需要指出的是,判斷條件一般為“外部的硬性條件”,比如“大于50”,而不是由數據自身指定,如“查找數組中最大的元素就不適合”。 Predicate _predicate = new Predicate (Check); //使用Lambda表達式 Predicate predicate = p => p % 2 == 0; _predicate(26); } static void SayHello(string strMsg) { Console.WriteLine(strMsg); } //返回值為bool值 static bool Check(int i) { if (i % 2 == 0) { return true; } return false; } } }
6、多播委托
實例化委托時必須將一個匹配函數注冊到委托上來實例化一個委托對象,但是一個實例化委托不僅可以注冊一個函數還可以注冊多個函數,注冊多個函數后,在執行委托的時候會根據注冊函數的注冊先后順序依次執行每一個注冊函數。
函數注冊委托的原型:
<委托類型> <實例化名>+=new <委托類型>(<注冊函數>)
例如:MyDelegate _myDelegate+=new MyDelegate(CheckMod);//將函數CheckMod注冊到委托實例_checkDelegate上
在.net 2.0開始可以直接將匹配的函數注冊到實例化委托:
<委托類型> <實例化名>+=<注冊函數>
例如:MyDelegate _myDelegate+=CheckMod;//將函數CheckMod注冊到委托實例_myDelegate上
注意:委托必須先實例化以后,才能使用+=注冊其他方法。如果對注冊了函數的委托實例從新使用=號賦值,相當于是重新實例化了委托,之前在上面注冊的函數和委托實例之間也不再產生任何關系。
有+=注冊函數到委托,也有-=解除注冊
例如:MyDelegate _myDelegate-=CheckMod;
如果在委托注冊了多個函數后,如果委托有返回值,那么調用委托時,返回的將是最后一個注冊函數的返回值。
namespace DelegateDemo { class Program { //聲明委托 delegate int MyDelegate(int x, int y); static void Main(string[] args) { MyDelegate _myDelegate = new MyDelegate(fun1); _myDelegate += fun2; Console.WriteLine(_myDelegate(10,23)); Console.ReadKey();//輸出10,返回最后一個注冊函數的返回值 } static int fun1(int x, int y) { return x + y; } static int fun2(int x, int y) { return x; } } }
原文鏈接:https://www.cnblogs.com/dotnet261010/p/6052829.html
相關推薦
- 2022-11-07 python多進程使用apply_async的使用方法詳解_python
- 2023-12-09 添加依賴時,出現了此問題maven Cannot resolve org.apache.dubbo:
- 2022-07-14 python輸出小數精度控制的方法_python
- 2023-01-08 Go設計模式原型模式考查點及使用詳解_Golang
- 2022-10-15 Windows10搭建FTP服務器詳細教程_FTP服務器
- 2022-07-08 Qt5?串口類QSerialPort的實現_C 語言
- 2022-08-17 python可視化分析繪制帶趨勢線的散點圖和邊緣直方圖_python
- 2022-10-06 Android?Fragment源碼分析Add方法_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支