目录
1.委托
核心特性
委托(delegate)是一种储存函数引用类型的的指针,允许将方法作为参数传递给其他方法,这也是它的核心作用,我们可以定义一个委托,例如:
public delegate void Mydg();
注意:定义委托的时候要注意委托的参数列表要和将要使用委托的方法参数列表一致
//使用需要先实例化
Mydg md;
//赋值的时候方法不可以加() 不然就成了调用方法
md = Show;
//调用委托
md();
Console.WriteLine("===============");
Mydg md1;
md1 = Show1;
//可以绑定多个方法
md1 += Show2;
md1();
public static void Show()
{
Console.WriteLine("学习数学");
}
static void Show1()
{
Console.WriteLine("学习语文");
}
static void Show2()
{
Console.WriteLine("学习英语");
}
结果:
委托支持通过+=
和-=
添加或移除方法,调用顺序与绑定顺序一致。
应用场景
回调机制:如异步操作完成后通知调用方。
策略模式:动态替换算法逻辑(如排序规则)。
LINQ查询:通过委托定义查询条件
2.事件
事件(event)是基于委托的,为委托提供一个发布/订阅的机制,或者说事件是一个具有特殊声明的委托,它限制了外部对委托的直接访问。
我们一般自定义委托
public delegate void DownDelegate();
public event DownDelegate downDelegate;
示例
class ToolMan
{
public delegate void DownDelegate();
public event DownDelegate downDelegate;
public string name;
public ToolMan(string name)
{
this.name = name;
}
public void Down()
{
Console.WriteLine($"工具人{name}下楼了");
Console.WriteLine("做一些自己的事情");
downDelegate();
}
}
class LazyMan
{
public string name;
public LazyMan(string name)
{
this.name = name;
}
public void TakeFood()
{
Console.WriteLine($"给{name}买饭");
}
public void TakeK()
{
Console.WriteLine($"给{name}拿快递");
}
}
Main方法里面
ToolMan t =new ToolMan("小明");
LazyMan l1 = new LazyMan("懒人1");
LazyMan l2 = new LazyMan("懒人2");
t.downDelegate += l1.TakeK;
t.downDelegate += l1.TakeFood;
t.downDelegate += l2.TakeK;
t.downDelegate += l2.TakeFood;
t.downDelegate -= l2.TakeFood;
t.Down();
结果:
可以看到代码正常运行了,但是大家也发现了,在这里我调用事件不是直接调用,而是通过Down()这个方法调用,这也是事件和委托最大的区别
要是我们想直接调用的话,会直接提示错误
异步与并发处理:
事件循环(Event Loop):通过消息队列管理任务,主线程按顺序执行同步代码,异步任务(如网络请求、定时器)由其他线程处理完成后返回队列等待调度,避免阻塞主线程
Promise与async/await:通过链式调用和状态机管理异步流程,支持错误冒泡和并行处理(如Promise.all
),提升代码可读性
多线程协作:在LabVIEW等环境中,通过自定义事件实现多线程间通信,动态注册事件处理程序以响应传感器或用户输入 。
应用场景
UI交互:如按钮点击、文本框内容变更。
状态通知:如温度传感器数据更新时通知订阅者。
3.区别
特性 | 委托 | 事件 |
---|---|---|
访问权限 | 外部可调用、修改(如赋值= ) |
仅允许订阅(+= /-= ) |
封装性 | 低(直接暴露) | 高(触发权在发布者内部) |
用途 | 灵活方法调用 | 松耦合通知机制(如UI事件) |