網站首頁 編程語言 正文
委托:委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。
委托(Delegate)特別用于實現事件和回調方法。所有的委托(Delegate)都派生自 System.Delegate 類。
1.Action委托
沒有返回值,可以不包含參數
(1)聲明委托、定位委托事件、向委托添加事件、執行委托
////// 不包含參數 /// private event Action Action_0; ////// 包含一個參數 /// private event ActionAction_1; /// /// 包含兩個參數 /// private event ActionAction_2; /// /// 包含三個參數 /// private event ActionAction_3; /// /// 定義沒有參數委托的事件 /// private void Fun_0() { Console.WriteLine("沒有參數"); } ////// 定義包含一個參數委托的事件 /// private void Fun_1(int nInt) { Console.WriteLine($"包含一個參數:{nInt}"); } ////// 定義包含兩個參數委托的事件 /// private void Fun_2(int nInt, double dDouble) { Console.WriteLine($"包含兩個參數,參數值:{nInt},{dDouble}"); } ////// 定義包含三個參數委托的事件 /// private void Fun_3(int nInt, double dDouble, string str) { Console.WriteLine($"包含三個參數,參數值:{nInt},{dDouble},{str}"); } //點擊事件 private void btn_Click(object sender, EventArgs e) { //向委托添加事件 Action_0 += Fun_0; Action_1 += Fun_1; Action_2 += Fun_2; Action_3 += Fun_3; //執行委托 Action_0.Invoke(); Action_1.Invoke(666); Action_2.Invoke(666,888.0); Action_3.Invoke(666,888,"Hello World"); }
輸出結果:
由于btn_Click為點擊事件,點擊第二次(第二次點擊會再次向委托添加事件)的數據結果如下:
因此,向委托添加事件時,一個事件僅添加一次即可,若進行多次添加則調用委托時會將添加進入委托的所有事件進行調用,無論該事件是否已添加都會進行調用,故做如下處理(在構造函數中或在程序啟動時添加委托事件):
上圖中委托調用時提示波浪線,因為是委托在調用時可能未添加事件,將會拋出:未將對象引用設置到對象的實例的異常信息,
異常信息:
故調用時進行異常處理或做如下處理:
處理方案1:
private void button1_Click(object sender, EventArgs e) { Action_0?.Invoke(); Action_1?.Invoke(666); Action_2?.Invoke(666, 888.0); Action_3?.Invoke(666, 888, "Hello World"); }
處理方案2
//執行委托 private void button1_Click(object sender, EventArgs e) { try { Action_0.Invoke(); Action_1.Invoke(666); Action_2.Invoke(666, 888.0); Action_3.Invoke(666, 888, "Hello World"); } catch (Exception ex) { MessageBox.Show("調用出現異常", "提示"); } }
此時,我們已經學會了Action委托的簡單使用,這時會有人考慮到,我想調用完返回信息Action委托并沒有返回,會限制我們的使用,不要著急,我們系統已經幫我們準備了一個現成的委托類型Func,下面我們對Func做個介紹。
2.Func委托
話不多說,上代碼,以下我們定義了包含兩個參數int和double,返回值為string類型的Func委托,并添加了兩個事件Fun_1和Fun_2:
public partial class Form1 : Form { ////// 包含兩個參數int和double,返回值為string類型委托 /// private event FuncTestFunc; /// /// 定義委托的事件 /// private string Fun_1(int nInt, double dDouble) { Console.WriteLine($"參數值:{nInt},{dDouble}"); return "事件:Fun_1"; } ////// 定義委托的事件 /// private string Fun_2(int nInt, double dDouble) { Console.WriteLine($"參數值:{nInt},{dDouble}"); return "事件:Fun_2"; } ////// 窗體構造函數 /// public Form1() { InitializeComponent(); InitAction(); } //向委托添加事件 private void InitAction() { TestFunc += Fun_1; TestFunc += Fun_2; } //執行委托 private void button1_Click(object sender, EventArgs e) { var result = TestFunc?.Invoke(888, 10); Console.WriteLine($"返回結果:{result}"); } }
輸出結果:
從輸出結果不難看出向委托添加多個事件(委托的多播或組播),委托包含返回值時,僅得到最后向委托添加的事件(方法)的返回值,所以在使用有返回值時必須注意這一點。
以下為先添加Fun_2后添加Fun_1的返回結果:
原文鏈接:https://blog.csdn.net/weixin_47492910/article/details/122959045
相關推薦
- 2022-03-10 Docker案例分析:搭建Redis服務_docker
- 2022-07-16 不同存圖方式下的DFS和BFS實現
- 2022-11-15 Python正則表達式re.search()用法詳解_python
- 2022-05-03 詳解Python利用APScheduler框架實現定時任務_python
- 2023-02-23 一文詳解C語言char類型中的存儲_C 語言
- 2022-06-06 自定義overflow產生的滾動條樣式設置
- 2022-10-06 Android?Activity啟動流程刨析_Android
- 2022-06-11 Go1.18?新特性之多模塊Multi-Module工作區模式_Golang
- 最近更新
-
- 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同步修改后的遠程分支