網站首頁 編程語言 正文
C#中的委托、事件與接口
- 一、委托
- (一)委托鏈
- (二)匿名函數
- (三)Lamda語句
- 二、事件
- 三、接口
一、委托
委托:將方法以變量的形式傳遞,以方法的形式執行
注意:賦值方法的返回類型、參數要與委托的一致(如委托定義的參數類型是string,那么賦值的參數類型也要是string,并且參數個數要一樣,委托的定義也是一樣)
詳細解釋:
C#所有的委托派生自 System.Delegate 類,委托是存有對某個方法的引用的一種引用類型變量,委托變量可以當作另一個方法的參數來進行傳遞,實現事件和回調方法。有點類似C++中的函數指針,但是又有所不同。在C++中,函數指針不是類型安全的,它指向的是內存中的某一個位置,我們無法判斷這個指針實際指向什么,對于參數和返回類型難以知曉。而C#的委托則完全不同,它是類型安全的,我們可以清晰的知道委托定義的返回類型和參數類型。
namespace delegation
{
//定義一個有參數并且無返回值的委托
public delegate void SayHelloDlg(string name);
class Program
{
static void Main(string[] args)
{
//委托的聲明
SayHelloDlg dlg = SayHello;
//委托的使用
dlg("小朱");
Console.ReadKey();
}
public static void SayHello(string name)
{
Console.WriteLine($"{name},你好呀!");
}
}
}
運行結果:
(一)委托鏈
委托鏈會按照委托注冊的順序依次執行委托
namespace delegation
{
//定義一個有參數并且無返回值的委托
public delegate void SayHelloDlg(string name);
class Program
{
static void Main(string[] args)
{
//委托的聲明
SayHelloDlg dlg = SayHello;
//委托鏈
dlg += SayGoodBye;
//委托的使用
dlg("小朱");
Console.ReadKey();
}
public static void SayHello(string name)
{
Console.WriteLine($"{name},你好呀!");
}
public static void SayGoodBye(string name)
{
Console.WriteLine($"{name},再見!");
}
}
}
運行結果:
注意:
Dlg += function 增加注冊委托
Dlg -= function 刪除注冊委托
(二)匿名函數
匿名函數:不用在下面生成一個獨立的方法 如果只需要調用一次的話
namespace delegation
{
//定義一個有參數并且無返回值的委托
public delegate void SayHelloDlg(string name);
class Program
{
static void Main(string[] args)
{
//匿名函數 不用在下面生成一個獨立的方法 如果只需要調用一次的話
SayHelloDlg dlg1 = delegate (string name)
{
Console.WriteLine($"{name},我是匿名函數!");
};
//委托的使用
dlg1("小朱");
Console.ReadKey();
}
}
}
(三)Lamda語句
相對于匿名函數來說更加的簡潔
namespace delegation
{
//定義一個有參數并且無返回值的委托
public delegate void SayHelloDlg(string name);
class Program
{
static void Main(string[] args)
{
//Lamda語句
SayHelloDlg dlg2 = (name) =>
{
Console.WriteLine($"{name},我是Lamda語句!");
};
//委托的使用
dlg2("小朱");
Console.ReadKey();
}
}
}
運行結果:
二、事件
事件:(簡單理解)一個被限制了的委托變量
**詳解:**委托相當于一系列函數的抽象類,這一系列函數要求擁有相同的參數和返回值;而事件(event)相當于委托的一個實例,事件是委托類型的成員,委托可以定義在類外面,而事件只能定義在類里面。
namespace delegation
{
//定義一個有參數并且無返回值的委托
public delegate void SayHelloDlg(string name);
class Program
{
//聲明事件
public static event SayHelloDlg SayHelloEvent;
static void Main(string[] args)
{
SayHelloEvent += Progame_SayHelloEvent;
if (SayHelloEvent != null)
SayHelloEvent("小朱");
Console.ReadKey();
}
public static void Progame_SayHelloEvent(string name)
{
Console.WriteLine($"{name},我是一個事件!");
}
}
}
三、接口
接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 “是什么” 部分,派生類定義了語法合同 “怎么做” 部分。
接口定義了屬性、方法和事件,這些都是接口的成員。接口只包含了成員的聲明。成員的定義是派生類的責任。接口提供了派生類應遵循的標準結構。
原文鏈接:https://blog.csdn.net/Z_hongli/article/details/127831765
相關推薦
- 2022-10-10 python中sort()函數用法詳解_python
- 2022-03-31 Python基礎中的列表你了解嗎_python
- 2022-05-14 linq中的分區操作符_實用技巧
- 2021-11-12 C/C++?Qt?StatusBar底部狀態欄應用教程_C 語言
- 2022-12-11 Redis?Cluster原理及配置詳解_Redis
- 2022-08-30 C語言深入探究sizeof與整型數據存儲及數據類型取值范圍_C 語言
- 2022-11-07 Android內置SQLite的使用詳細介紹_Android
- 2022-08-14 Selenium定位瀏覽器彈窗方法實例總結_python
- 最近更新
-
- 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同步修改后的遠程分支