欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > C#委托和事件

C#委托和事件

2025/4/19 8:57:41 来源:https://blog.csdn.net/qq_44716013/article/details/147253156  浏览:    关键词:C#委托和事件

目录

1.委托

核心特性

应用场景

2.事件

示例

应用场景

3.区别


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事件)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词