1 什么是委托?
委托是C#中的一种引用类型,它用来存储和调用方法,功能类似于C++中的函数指针,但在类型安全性和灵活性上更强大。
1.1 C++函数指针的基本语法
#include
using namespace std;
// 一个简单的函数,接收一个整数参数并打印它
void PrintNumber(int number)
{
? ?cout << "The number is: " << number << endl;
}
int main()
{
? ?// 定义一个函数指针,指向接收一个整数参数并返回 void 的函数
? ?void (*funcPtr)(int);
? ?// 将 PrintNumber 函数的地址赋值给函数指针
? ?funcPtr = PrintNumber;
? ?// 使用函数指针调用 PrintNumber 函数
? ?funcPtr(5); ?// 输出: The number is: 5
? ?return 0;
}
1.2. 委托的基本语法
// 定义一个委托类型
public delegate void MyDelegate(string message);
// 定义一个与委托签名匹配的方法
public void ShowMessage(string message)
{
? ?Console.WriteLine(message);
}
// 使用委托
MyDelegate del = ShowMessage;
del("Hello, Delegates!"); ?// 输出: Hello, Delegates!
1.1.2. 为什么使用委托?
优点 | 解释 | 示例 |
回调机制 | 将委托做为参数传递,并调用该委托 | 异步操作完成后通知主程序。 |
事件处理 | 常用于处理事件响应。 | 处理按钮点击事件。 |
灵活性 | 使代码更灵活,可动态绑定和解绑方法。 | 可以随时更改调用的方法。 |
可扩展性 | 允许动态添加或删除方法,增强程序功能。 | 运行时修改方法逻辑。 |
解耦 | 将方法调用者与被调用者分离,减少依赖,提高模块化。 | 不同模块间通过委托通信,降低耦合度。 |
1.1.3. 多播委托
多播委托可以同时引用多个方法,并依次调用这些方法。
public delegate void MyDelegate(string message);
public class Program
{
? ?public static void ShowMessage(string message)
? {
? ? ? ?Console.WriteLine("Message: " + message);
? }
? ?public static void LogMessage(string message)
? {
? ? ? ?Console.WriteLine("Log: " + message);
? }
? ?public static void Main()
? {
? ? ? ?MyDelegate del = ShowMessage; // 添加第一个方法
? ? ? ?del += LogMessage; ? ? ? ? ? ?// 添加第二个方法
? ? ? ?del("Hello, Multi-cast Delegates!"); // 依次调用 ShowMessage 和 LogMessage
? }
}
// 输出:
// Message: Hello, Multi-cast Delegates!
// Log: Hello, Multi-cast Delegates!
1.1.4. 内置委托
C# 提供了几个常用的内置委托,简化了委托的使用:
委托类型 | 描述 | 示例 |
Action | 不返回值,有 0 到多个参数。 | Action |
Func | 有返回值,有 0 到多个参数。 | Func |
Predicate | 返回 bool,有一个参数。 | Predicate |
using System;
public class Program
{
? ?public static void Main()
? {
? ? ? ?// 使用 Action 示例
? ? ? ?Action action = ShowMessage;
? ? ? ?action("Hello, Action!"); ?// 输出: Hello, Action!
? ? ? ?// 使用 Func 示例
? ? ? ?Func func = (a, b) => a + b;
? ? ? ?int result = func(3, 4); // 返回 7
? ? ? ?Console.WriteLine("Func result: " + result); ?// 输出: Func result: 7
? ? ? ?// 使用 Predicate 示例
? ? ? ?Predicate predicate = x => x > 10;
? ? ? ?bool isGreater = predicate(15); // 返回 true
? ? ? ?Console.WriteLine("Predicate result: " + isGreater); ?// 输出: Predicate result: True
? }
? ?// ShowMessage 方法
? ?public static void ShowMessage(string message)
? {
? ? ? ?Console.WriteLine(message);
? }
}