|
在 C# 中,`Func<>` 和 `Action<>` 是两种常用的委托类型,它们的主要区别在于**返回值**和**用途**。以下是它们的详细对比:
---
### **1. `Action<>`**
- **定义**:
- `Action<>` 是一个泛型委托,用于表示没有返回值的方法。
- 它可以接受 0 到 16 个输入参数。
- **签名**:
- `Action`:无参数,无返回值。
- `Action<T>`:接受 1 个参数,无返回值。
- `Action<T1, T2>`:接受 2 个参数,无返回值。
- 以此类推,最多支持 16 个参数。
- **用途**:
- 用于封装没有返回值的方法。
- 常用于事件处理、回调函数或需要执行某些操作但不需要返回结果的场景。
**示例**:
- <p>// 无参数</p><p>Action printHello = () => Console.WriteLine("Hello");</p><p>printHello(); // 输出: Hello</p><p>
- </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 查询、数学计算等。
- **示例**:
- <p>// 无参数,返回 int</p><p>Func<int> getRandomNumber = () => new Random().Next(1, 100);</p><p>int number = getRandomNumber(); // 返回一个随机数</p><p>
- </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<>` 的使用场景**
事件处理:
- <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<>` 的使用场景**
- <p>// LINQ 查询:</p><p> var evenNumbers = numbers.Where(n => n % 2 == 0);</p><p>
- </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、事件处理、异步编程和回调函数等场景中。
|
|