在C#里,委托(delegate)是一种引用类型,它用来封装具有一定参数列表和返回类型的方法。简单说,委托就是一张能指向某个函数的名片,你拿着这张名片,就能在需要的时候调用对应的方法,而不用关心这个方法具体叫什么、写在哪个类里。

委托的基本概念
普通变量用来存数据,而委托变量用来存方法。C#要求委托指向的方法,其参数和返回值必须和委托定义一致,这就是类型安全。这样在编译阶段就能发现传错方法的问题。
如何声明和使用委托
使用 delegate 关键字可以声明一个委托类型。下面示例演示了声明、实例化与调用:
// 声明一个委托,要求指向无参数、返回string的方法
public delegate string SayHello();
class Program
{
// 符合委托签名的方法
static string HelloChinese()
{
return "你好";
}
static void Main()
{
// 把方法赋值给委托变量
SayHello handler = new SayHello(HelloChinese);
// 也可以简写:SayHello handler = HelloChinese;
// 通过委托调用方法
string result = handler();
System.Console.WriteLine(result);
}
}
委托的常见用途
- 事件处理:WinForms或WPF里按钮点击就是用委托实现的。
- 回调方法:把委托当参数传给其他方法,让对方在合适时机回调。
- 解耦逻辑:上层代码只依赖委托签名,不依赖具体实现类。
多播委托
一个委托变量可以绑定多个方法,这叫多播委托。用 += 添加方法, -= 移除方法。调用时按添加顺序依次执行,如果方法有返回值,只能拿到最后一个方法的返回。
public delegate void PrintMsg(string msg);
class Demo
{
static void A(string s) { System.Console.WriteLine("A:" + s); }
static void B(string s) { System.Console.WriteLine("B:" + s); }
static void Main()
{
PrintMsg p = A;
p += B; // 现在p会先调A再调B
p("hi");
}
}
小结
委托是C#中实现方法传递与回调的核心机制,也是事件和Lambda的基础。掌握 delegate 的声明、绑定与调用,就能写出更灵活、低耦合的程序。