C#中的委托搞懂了(c#委托有几种)

C#中的委托搞懂了(c#委托有几种)

编码文章call10242025-02-01 3:28:0014A+A-

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 action = ShowMessage; action("Hello, Action!");

Func

有返回值,有 0 到多个参数。

Func func = (a, b) => a + b; int result = func(3, 4); // 返回 7

Predicate

返回 bool,有一个参数。

Predicate predicate = x => x > 10; bool isGreater = predicate(15); // 返回 true

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);
 ?  }
}
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4