在 C# 中,委托(Delegate) 是一种类型安全的函数指针,可以将方法作为参数传递或者保存方法的引用。下面详细介绍一下委托的相关概念和用法:
1. 基本概念
- 类型安全:委托在声明时会指定方法的返回类型和参数列表,只有符合签名的方法才能赋值给该委托,保证了类型安全。
- 多播能力:委托不仅可以引用一个方法,还能同时引用多个方法。当调用委托时,会依次调用所有被引用的方法(适用于返回类型为 void 的委托)。
- 面向对象:委托是对象,可以赋值、传递、比较等,与其他对象一样。
2. 委托的声明与使用
-
声明委托 :使用
delegate
关键字来定义一个委托类型。例如:csharppublic delegate int MathOperation(int a, int b);
这里声明了一个
MathOperation
委托,要求所引用的方法必须接受两个int
参数并返回一个int
。 -
实例化委托:可以将符合签名的方法赋值给委托对象:
csharppublic class Calculator { public int Add(int x, int y) { return x + y; } } // 使用委托 Calculator calc = new Calculator(); MathOperation op = new MathOperation(calc.Add); int result = op(3, 4); // result 为 7
-
匿名方法和 Lambda 表达式:除了直接引用已有方法,还可以使用匿名方法或 Lambda 表达式来创建委托实例:
csharpMathOperation multiply = delegate (int x, int y) { return x * y; }; MathOperation subtract = (x, y) => x - y;
3. 多播委托
-
组合委托 :多播委托可以同时指向多个方法,使用
+
操作符或者Delegate.Combine
方法将多个方法组合到一个委托中:csharppublic delegate void Notify(); // 返回类型为 void 的委托 public class Process { public void MethodA() { Console.WriteLine("MethodA called"); } public void MethodB() { Console.WriteLine("MethodB called"); } } Process p = new Process(); Notify notifyDel = p.MethodA; notifyDel += p.MethodB; // 添加第二个方法 notifyDel(); // 依次调用 MethodA 和 MethodB
注意,对于返回值不为 void 的委托,多播时只会返回最后一个方法的返回值。
4. 委托的实际应用
- 事件处理 :委托是 C# 事件模型的核心。事件通常由一个委托类型(例如
EventHandler
)来定义,当事件触发时,所有注册的事件处理方法都会被调用。 - 回调机制:通过委托,可以实现回调方法,允许某个方法在执行完毕后通知其他方法执行特定逻辑。
- 灵活的设计模式:委托常用于策略模式、观察者模式等场景,提高代码的灵活性和可扩展性。
5. 总结
委托在 C# 中扮演着连接方法与调用者的桥梁角色,它使得程序能够更加灵活地处理方法调用、事件通知和回调等场景。通过类型安全、易于组合和传递,委托成为构建松耦合、可扩展系统的重要工具。