C#中委托和事件的区别

本文详细阐述了C#中委托和事件的区别。事件实际上是对私有委托链的封装,提供Add和Remove方法来管理事件处理程序,确保代码安全性。通过实例展示了如何使用委托传递方法,并解释了事件如何通过封装私有委托来实现更安全的事件处理。此外,还提到了其他学习委托和事件的资源,如NGUI的EventDelegate类。
摘要由CSDN通过智能技术生成

言简意赅的解释

先说总结:事件就是委托链(也就是继承自MulticastDelegate类的委托,用delegate声明的委托就是继承自MulticastDelegate类的)的属性,事件有一个Add方法、一个Remove方法以及一个私有委托链。也就是说,声明一个事件,类似于声明一个进行封装了的委托链。

很多人说:“总是感觉委托和事件没什么区别,调用事件不就是相当于调用多个委托么?”
不全对,事件之于委托,就相当于,集合的属性之于集合的元素,注意:事件封装了私有委托链,事件其实就是一个特殊的多播委托(也叫委托链)。

举个例子:

class Program
{
	public delegate void SendHandler(string str); // 用delegate声明的委托就是继承自MulticastDelegate类的
	public event SendHandler SendEvent; // 用刚声明的委托类型来声明事件
	static void Main(string[] args)
	{ }
}

编译后,用ILDASM.EXE打开那个.exe,就会发现SendHandler委托被编译为了一个叫做SendHandler的类,声明的委托就是一个类嘛。
在这里插入图片描述
SendEvent事件则是被编译成了包含一个add_前缀的方法(通过调用Delegate.Combine()方法来实现)和一个remove_前缀的方法(通过调用Delegate.Remove()方法来实现)。这是默认实现,事件是可以自行重写add和remove的。

好了,前面说的都不是废话,你还会看到一个私有字段SendEvent(蔚蓝色菱形),其存储了对事件处理方法的引用。而add_前缀方法和remove_前缀方法起到的就是类似C#属性访问器中get_和set_方法的封装私有字段的作用,使用事件能访问私有委托。简而言之,事件就是用来访问私有的委托字段,让应用程序的代码更加的安全。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值