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