找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 7|回复: 0

[工具类] 在 C# 中,`Func<>` 和 `Action<>` 是两种常用的委托类型

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式
在 C# 中,`Func<>` 和 `Action<>` 是两种常用的委托类型,它们的主要区别在于**返回值**和**用途**。以下是它们的详细对比:

---

### **1. `Action<>`**

- **定义**:
  - `Action<>` 是一个泛型委托,用于表示没有返回值的方法。
  - 它可以接受 0 到 16 个输入参数。

- **签名**:
  - `Action`:无参数,无返回值。
  - `Action<T>`:接受 1 个参数,无返回值。
  - `Action<T1, T2>`:接受 2 个参数,无返回值。
  - 以此类推,最多支持 16 个参数。

- **用途**:
  - 用于封装没有返回值的方法。
  - 常用于事件处理、回调函数或需要执行某些操作但不需要返回结果的场景。

**示例**:
  1. <p>// 无参数</p><p>Action printHello = () => Console.WriteLine("Hello");</p><p>printHello(); // 输出: Hello</p><p>
  2. </p><p>// 带参数</p><p>Action<string> printMessage = (message) => Console.WriteLine(message);</p><p>printMessage("Hello, World!"); // 输出: Hello, World!</p>
复制代码

### **2. `Func<>`**

- **定义**:
  - `Func<>` 是一个泛型委托,用于表示有返回值的方法。
  - 它可以接受 0 到 16 个输入参数,最后一个泛型参数是返回值类型。

- **签名**:
  - `Func<TResult>`:无参数,返回 `TResult` 类型的结果。
  - `Func<T, TResult>`:接受 1 个参数,返回 `TResult` 类型的结果。
  - `Func<T1, T2, TResult>`:接受 2 个参数,返回 `TResult` 类型的结果。
  - 以此类推,最多支持 16 个参数。

- **用途**:
  - 用于封装有返回值的方法。
  - 常用于需要返回结果的场景,如 LINQ 查询、数学计算等。

- **示例**:
  1. <p>// 无参数,返回 int</p><p>Func<int> getRandomNumber = () => new Random().Next(1, 100);</p><p>int number = getRandomNumber(); // 返回一个随机数</p><p>
  2. </p><p>// 带参数,返回 int</p><p>Func<int, int, int> add = (a, b) => a + b;</p><p>int result = add(3, 5); // 返回 8</p>
复制代码

### **3. 主要区别**

| 特性                | `Action<>`                          | `Func<>`                            |
|--------------------|-------------------------------------|-------------------------------------|
| **返回值**      | 无返回值 (`void`)                   | 有返回值(最后一个泛型参数)        |
| **参数数量**   | 支持 0 到 16 个输入参数             | 支持 0 到 16 个输入参数             |
| **用途**         | 用于封装没有返回值的方法             | 用于封装有返回值的方法               |
| **示例**         | `Action<string> print = Console.WriteLine;` | `Func<int, int, int> add = (a, b) => a + b;` |


### **4. 使用场景**

#### **`Action<>` 的使用场景**
事件处理:
  1. <p>  button.Click += (sender, e) => Console.WriteLine("Button clicked!");</p><p>//异步操作的回调:</p><p>  Task.Run(() => DoWork()).ContinueWith(task => Console.WriteLine("Work done!"));</p><p>//执行某些操作但不需要返回值:</p><p>  Action<string> log = message => File.AppendAllText("log.txt", message);</p><p>  log("New log entry.");</p>
复制代码
#### **`Func<>` 的使用场景**
  1. <p>// LINQ 查询:</p><p>  var evenNumbers = numbers.Where(n => n % 2 == 0);</p><p>
  2. </p><p>// 数学计算:</p><p>  Func<int, int, int> multiply = (a, b) => a * b;</p><p>  int product = multiply(4, 5); // 返回 20</p><p> </p><p>// 延迟计算:</p><p>  Func<int> getValue = () => CalculateValue();</p><p>  int value = getValue(); // 延迟计算</p>
复制代码

### **5. 总结**

| 特性                | `Action<>`                          | `Func<>`                            |
|---------------------|-------------------------------------|-------------------------------------|
| **返回值**          | 无返回值 (`void`)                   | 有返回值(最后一个泛型参数)        |
| **参数数量**        | 支持 0 到 16 个输入参数             | 支持 0 到 16 个输入参数             |
| **用途**            | 用于封装没有返回值的方法             | 用于封装有返回值的方法               |

- 如果你需要封装一个没有返回值的方法,使用 `Action<>`。
- 如果你需要封装一个有返回值的方法,使用 `Func<>`。

这两种委托类型在 C# 中非常常用,尤其是在 LINQ、事件处理、异步编程和回调函数等场景中。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|西兴社区 ( 蜀ICP备2022005627号 )|网站地图

GMT+8, 2025-3-12 19:37 , Processed in 0.171437 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表