C# delegate
时间: 2025-05-27 09:27:33 浏览: 15
### C# 中的委托 (Delegate) 概念与用法
#### 什么是委托?
在 C# 中,委托是一种类型安全的函数指针。它允许将方法作为参数传递给其他方法,或者存储在一个变量中以便稍后调用[^3]。通过定义一个委托类型并实例化该类型的对象,可以在运行时动态绑定到任何匹配签名的方法。
#### 定义和声明委托
以下是创建简单委托的一个基本例子:
```csharp
// 定义一个返回整数并接受两个整型参数的委托
public delegate int MathOperation(int num1, int num2);
```
此 `MathOperation` 委托可以指向任意具有相同输入输出特征(即接收两个 `int` 类型参数并返回单个 `int` 的方法)的方法。
#### 使用委托的例子
下面展示如何实际运用上面所定义之委托来执行加减运算操作:
```csharp
class Program {
public static void Main() {
// 实例化委托至具体实现方法
MathOperation addition = new MathOperation(AddNumbers);
MathOperation subtraction = SubtractNumbers;
Console.WriteLine("Sum: {0}", addition(7, 5)); // 输出 Sum: 12
Console.WriteLine("Difference: {0}", subtraction(7, 5)); // 输出 Difference: 2
// 多播委托演示
MathOperation combinedOperations = addition + subtraction;
combinedOperations(8, 4); // 调用了 AddNumbers 和 SubtractNumbers 方法
}
private static int AddNumbers(int a, int b){
return a+b;
}
private static int SubtractNumbers(int c, int d){
return c-d;
}
}
```
在这个案例里展示了几个重要特性:
- **单一广播**: 将单独的方法赋值给了委托.
- **多播**: 可以把多个方法链接起来形成一个多播链表.
#### 泛型委托
除了自定义委托外,C# 还提供了几种内置泛型形式简化常见场景下的工作流程.比如 `Action`, `Func`,以及 `Predicate`.
##### Action<T>
表示无返回值的操作,可带零个或更多参数。
```csharp
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello Delegate!"); // Hello Delegate!
```
##### Func<TResult>
类似于 action 不过支持指定返回类型 TResult .
```csharp
Func<int,int,bool> compareValues = (valA,valB)=> valA==valB ;
Console.WriteLine(compareValues(10 ,10 )); // True
```
##### Predicate<T>
专门用于布尔表达式的判断逻辑处理.
```csharp
List<int> numbers=new List<int>{1,-2,3};
var positives=numbers.FindAll(new Predicate<int>(IsPositive));
foreach(var item in positives ){
Console.Write(item+" "); // Outputs : 1 3
}
private bool IsPositive(int number){
return number>=0 ? true:false ;
}
```
以上这些预设好的通用模板极大地方便了开发者快速构建灵活的应用程序结构而无需每次都重新设计特定用途的新类形体.
### 注意事项
尽管使用 Predicates 和 Actions 提供了很多便利之处,但也应该注意它们可能会影响代码的整体清晰度和维护难度[^1].因此,在决定采用何种方式之前应当权衡利弊做出最合适的选择方案。
阅读全文
相关推荐


















