網站首頁 編程語言 正文
委托和事件的概念
委托
C# 中的委托(Delegate)類似于 C 或 C++ 中函數的指針。委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。它本質上也是一個類。
它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法。
事件
事件由對象引發,通過我們提供的代碼來處理。一個事件我們必須訂閱(Subscribe)他們,訂閱一個事件的含義就是提供代碼,在這個事件發生時執行這些代碼,這些代碼稱為事件處理程序。
事件是在委托類型變量前加上 event 關鍵字,其本質是用來對委托類型的變量進行封裝,類似于類的屬性對字段的封裝。
委托和事件的作用
委托
可以把方法當參數傳遞,可以避免在程序中大量使用 if-else(switch) 語句,同時使得程序具有更好的可擴展性。C#2.0 之后出現了 匿名函數 和 lambda表達式 也是 Delegate 演化而來。
事件
事件的使用一般通過發布者和訂閱者來進行。發布者會在某一條件下觸發某事件,訂閱者可以通過訂閱該事件,來對該事件的觸發做出反應。
在設計模式中的訂閱者模式是最佳實踐。
委托和事件的區別
1、事件是委托的封裝 —— 是一種特殊的委托。(初學時已經了解)
2、事件里面其實就是兩個方法(即 add_event() 和 remove_event())和一個私有的委托變量,這兩個方法里面分別是對這個私有的委托變量進行的合并和移除,當調用事件的 += 時其實是調用的事件里面的 add_event() 方法,同樣 -= 調用的是 remove_event() 方法。
3、在注冊和注銷事件上:
委托可以使用 = 和 += 來將函數注冊到委托的變量上,使用 -= 來將函數注銷。
事件則有著更嚴格的限制,事件只能使用 += 來將函數注冊到其上,使用 -= 來將函數注銷。
委托和事件代碼實踐
委托
“中國人和外國人問候” —— 經典面試題
internal class Program
{
static void Main(string[] args)
{
CallDelegate("王二狗", SayChinese);
CallDelegate("Tom", SayEnglish);
}
/// <summary>
/// 聲明委托
/// </summary>
/// <param name="name"></param>
public delegate void DelegateSayHi(string name);
/// <summary>
/// 聲明委托調用方法
/// </summary>
/// <param name="name"></param>
/// <param name="sayHi"></param>
public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name);
/// <summary>
/// 聲明實現方法
/// </summary>
/// <param name="name"></param>
public static void SayChinese(string name)
{
Console.WriteLine($"你好,{name}");
}
/// <summary>
/// 聲明實現方法
/// </summary>
/// <param name="name"></param>
public static void SayEnglish(string name)
{
Console.WriteLine($"Hello,{name}");
}
}
事件
“貓叫、老鼠跑了,主人醒來了” —— 經典面試題
internal class Program
{
static void Main(string[] args)
{
Mouse();
People();
Scream();
}
/// <summary>
/// 聲明委托
/// </summary>
public delegate void DelegateScream();
/// <summary>
/// 聲明事件
/// </summary>
public static event DelegateScream OnScream;
public static void Scream()
{
Console.WriteLine("貓叫了一聲");
OnScream?.Invoke();
}
public static void Mouse()
{
OnScream += () =>
{
Console.WriteLine("老鼠跑了");
};
}
public static void People()
{
OnScream += () =>
{
Console.WriteLine("主人醒了");
};
}
}
總結
事件是一種特殊的委托,事件的最佳實踐為訂閱者模式。委托可以將函數作為參數傳遞,消除了很多不必要的判斷,增強了程序的健壯性和可擴展性。熟練并掌握委托和事件,有助我們寫出更優雅、易讀且性能優越的代碼。
原文鏈接:https://blog.csdn.net/qq_43562262/article/details/127816246
相關推薦
- 2022-06-08 并發編程CountdownLatch結合線程池實現
- 2023-04-03 Python數據結構隊列解決約瑟夫斯問題_python
- 2022-04-07 C++11實現字符串分割的示例_C 語言
- 2022-09-05 Go語言接口的用法詳解_Golang
- 2022-08-25 Asp.net?core中依賴注入的實現_實用技巧
- 2022-09-21 jquery實現網頁左側導航菜單欄_jquery
- 2022-03-11 Linux fatal error: iostream: No such file or direc
- 2023-01-18 Android?Intent通信詳細講解_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同步修改后的遠程分支