定义
委托:是一个类,它定义了方法签名(返回类型和方法参数),能够获取匹配它方法签名的任何方法的引用,本质是一个类型安全的函数指针
事件:是类成员(可以当成一个字段),是委托的封装
定义语法如下:
public delegate void MyDelegate(string message);
public event MyDelegate MyEvent;
| 为什么需要委托
- 解决“方法作为参数的需求”(回调机制) 
- 解耦调用方和被调用方,不再依赖具体方法名
- 支持事件驱动编程(为事件奠基)
- 启用函数式编程范式(高阶函数)
- 简化异步和并发编程
 
举例场景
根据用户输入*,-,*,/实现一个计算方法
  public int Calcute(string type,int x,int y)  {      int res = 0;      switch (type)      {          case "+":              res = Add(x, y);              break;          case "-":              res = Sub(x, y);              break;          case "*":              res = Mul(x, y);              break;          case "/":              res = Div(x, y);              break;          default:              break;
      }
      return res;  }     public int Add(int x,int y) {     return x + y; }
 public int Sub(int x ,int y) {     return x - y; }
 public int Mul(int x ,int y) {     return x * y; }
 public int Div(int x,int y) {     return x / y; }
  public delegate int CalculDelegate(int x, int y);
  public int CalcaulByDelegate(int x,int y,CalculDelegate calculDelegate)  {      int res = 0;      if (calculDelegate != null)      {          res=calculDelegate(x, y);      }      return res;  }    public int CalcuteTest(string type, int x, int y)  {      int res = 0;      switch (type)      {          case "+":              res = CalcaulByDelegate(x,y,(a,b)=>a+b);              break;          case "-":              res = CalcaulByDelegate(x, y, (a, b) => a - b);              break;          case "*":              res = CalcaulByDelegate(x, y, (a, b) => a * b);              break;          case "/":              res = CalcaulByDelegate(x, y, (a, b) => a / b);              break;          default:              break;
      }
      return res;  }
通过使用事件,实现动态插入自定义方法,代码灵活性、复用性更高
| 为什么使用事件
实现安全的发布——订阅的通知机制,事件只能做订阅和取消订阅操作且不会干扰其他订阅者。而任何的委托拥有者都可以覆盖和移除委托方法,会对其他委托拥有者造成干扰,是不安全的。
| 常用泛型委托
- 无返回类型的泛型委托Action - 最多包含16个参数 
Action printHello = () => Console.WriteLine("Hello");printHello();Action<string> printMessage = msg => Console.WriteLine(msg);printMessage("泛型委托示例");
- 有返回值类型的泛型委托Func - 最多包含16个参数 - Func<int, string> intToString = num => num.ToString();- string result = intToString(42); - Func<int, int, bool> isEqual = (a, b) => a == b;- bool check = isEqual(10, 10); 
 
| 实际应用场景
- 集合操作 - List<int> data = new List<int> { 1, 2, 3 };- var squared = data.ConvertAll(x => x * x); 
 
2.回调方法
void ProcessData<T>(T data, Action<T> callback) {        callback(data);}ProcessData(42, result => Console.WriteLine($"结果: {result}"));
3.事件处理
public event Action<string> LogEvent;
LogEvent?.Invoke("事件已触发");
| 小结
泛型委托(如 Action、Func)是 C# 中实现回调、事件处理和 LINQ 的核心机制。它们通过泛型提供类型安全和灵活性,显著提升代码的可维护性和复用性。掌握泛型委托能有效简化复杂逻辑的设计。
阅读原文:原文链接
该文章在 2025/10/20 10:24:30 编辑过