网站首页 > 技术文章 正文
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-07-24 Channels: C# 实现高效的线程间通信
- 2025-07-24 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
- 2025-07-24 C# 获取Windows的系统信息(c# 获取本机的ip地址)
- 2025-07-24 C# 读取本地网络配置信息(c# 读取配置文件的方法)
- 2025-07-24 MODBUS协议在C#中的应用案例(c#modbus 程序)
- 2025-07-24 C#接口(c接口镜头)
- 2025-07-24 AngleSharp :在 C# 中轻松解析和操作 HTML/XML 文档
- 2025-07-24 C#中的9个“黑魔法”与“骚操作”
- 2025-07-24 C#.NET Ninject 详解(c#.net framework)
- 2025-07-24 C#.NET HttpClient 使用教程(c#开启http服务)
- 最近发表
-
- 架构师必备技能之JVM调优_jvm调优方案
- 记一次简单的Java内存排查_java内存检测工具
- 大量类加载器创建导致诡异FullGC_类加载器加载程序运行所需要的所有类,由网络系统导入
- 频繁Full GC如何优化?_频繁fullgc如何处理
- Java JAR 启动内存参数配置指南:从基础设置到性能优化
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- 通过JVM定位和分析一次生产案例_jvm如何定位一个对象
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 说一下JDK的监控和 线上处理的一些case
- 那个小白还没搞懂内存溢出,只能用案例说给他听了
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)