一、委托的基础知识
1. 委托的定义与本质
在 C# 中,委托相当于一个指向方法的安全类型化指针,它本质上是一种特殊的类,编译后会继承自 System.MulticastDelegate。例如:
public delegate int Compute(int x, int y);
以上代码声明了一个名为 Compute 的委托类型,其方法签名必须接受两个 int 类型参数并返回一个 int。
2. 委托的实例化与调用
实例化委托需要一个匹配其签名的方法作为参数,可以通过下面两种方式完成:
// 方法定义
int Add(int a, int b) { return a + b; }// 实例化委托
Compute compute = new Compute(Add);
// 简化形式(自 C# 2.0 起支持)
Compute computeSimple = Add;
调用委托时可以直接使用委托变量,就像直接调用方法一样,并且可以省略.Invoke。:
int result = compute(2, 3); // 效果相同于 compute.Invoke(2, 3)
这种方式保证了编译器在编译期进行类型检查,确保传递的方法参数与委托约束一致。
二、委托在解耦设计中的应用
委托的重要特性之一是解耦。在传统面向对象设计中,上层模块对下层模块往往存在强依赖,而委托能够有效解耦这种依赖关系。
- 自上而下解耦:上层逻辑无需了解具体实现,只需通过委托传入符合规范的实现方法。例如,一个策略模式的实现就可以利用委托来切换不同的算法。
- 自下而上代码复用:多个模块可以共用同一段实现逻辑,只需要将该逻辑封装到一个方法中,通过委托调用,就能减少代码重复。
示例代码展示了如何利用委托实现简洁灵活的代码调用:
public void ProcessOperation(Compute operation)
{int result = operation(5, 10);Console.WriteLine