网站首页 > 技术文章 正文
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);
}
}
猜你喜欢
- 2025-04-30 基本语法 - C#入门教程(c#基础语法汇总pdf)
- 2025-04-30 C# OpenCV机器视觉:缺陷检测(opencv缺陷检测案例)
- 2025-04-30 C#与TypeScript语法深度对比(c#typeof作用)
- 2025-04-30 .NET10:C#14的一些新功能(c# 10.0)
- 2025-04-30 39.C# 接口(c#接口是什么)
- 2025-04-30 C# 中的Async 和 Await 的用法详解
- 2025-04-30 C#之类型转换(c#类型转换有哪几种)
- 2025-04-30 设计模式(C#) - 装饰器模式实现详解
- 2025-04-30 C#中的Channel(c#中的类由哪三个部分组成)
- 2025-04-30 C# 管道模式:构建灵活、可扩展的处理流程
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- js判断是否空对象 (63)
- sqlset (59)
- phprequire_once (61)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)