定义
委托:是一个类,它定义了方法签名(返回类型和方法参数),能够获取匹配它方法签名的任何方法的引用,本质是一个类型安全的函数指针
事件:是类成员(可以当成一个字段),是委托的封装
定义语法如下:
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 编辑过