1 什么是委托?
委托是C#中的一种引用类型,它用来存储和调用方法,功能类似于C++中的函数指针,但在类型安全性和灵活性上更强大。
1.1 C++函数指针的基本语法
#include <iostream>
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<string> action = ShowMessage; action("Hello, Action!"); |
Func | 有返回值,有 0 到多个参数。 | Func<int, int, int> func = (a, b) => a + b; int result = func(3, 4); // 返回 7 |
Predicate | 返回 bool,有一个参数。 | Predicate<int> predicate = x => x > 10; bool isGreater = predicate(15); // 返回 true |
using System;
public class Program
{
public static void Main()
{
// 使用 Action 示例
Action<string> action = ShowMessage;
action("Hello, Action!"); // 输出: Hello, Action!
// 使用 Func 示例
Func<int, int, int> func = (a, b) => a + b;
int result = func(3, 4); // 返回 7
Console.WriteLine("Func result: " + result); // 输出: Func result: 7
// 使用 Predicate 示例
Predicate<int> 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);
}
}