摘要: 委托是C#实现事件驱动和回调机制的核心技术,其设计理念体现了「将方法作为参数传递」的函数式编程思想。本文将系统解析委托的声明与实例化过程。
委托本质是一种类型安全的函数指针类型,声明规则如下:
delegate void MyDel(int x); // 声明委托类型
独立于类存在(与类同级命名空间)
namespace MyApp {
public delegate void MyDel(int x); // ✅ 正确位置
public class Processor {
// 类内部不能声明委托类型 ❌
}
}
委托是引用类型,实例化时需要绑定具体方法。两种创建方式:
// 实例方法绑定
MyClass obj = new MyClass();
MyDel delVar = new MyDel(obj.InstanceMethod);
// 静态方法绑定
MyDel dVar = new MyDel(StaticClass.StaticMethod);
MyDel delVar = obj.InstanceMethod; // 自动转换为委托对象
MyDel dVar = StaticClass.StaticMethod;
两种方式完全等价,编译器自动转换方法引用为委托对象
class Example {
// 实例方法
public void PrintNumber(int num)
=> Console.WriteLine($"实例输出: {num}");
// 静态方法
public static void LogNumber(int num)
=> Console.WriteLine($"静态输出: {num}");
}
// 使用委托
var ex = new Example();
MyDel del1 = new MyDel(ex.PrintNumber); // 绑定实例方法
MyDel del2 = Example.LogNumber; // 绑定静态方法(快捷语法)
del1(100); // 输出: 实例输出: 100
del2(200); // 输出: 静态输出: 200
技术本质:
内存模型
类型安全
多播能力
设计哲学思考:委托将方法提升为“一等公民”,解耦调用者与被调方法,为事件机制、Lambda表达式、LINQ等技术奠定基础。