事件是一种委托吗?什么是委托?什么是事件?
以下仅个人理解,兼听则明偏听则暗!
一·先直接回答下个人理解,事件不是委托,我们可以理解成他是委托的一个实例。它使用委托的语言支持构建的。
二·委托
我们可以把他理解成这样的一个对象,他包含相同签名和返回值类型的有序方法列表,也可以这样理解,他是可以把方法当做参数传递的一个类型(这些方法我们成为委托的方法列表)。
从本质上来讲,他和int,string,类,结构等一样,是一种类型,并且他是引用类型。就像类一样,他也是需要声明并且new出一个对象的。
那委托他是怎么工作的呢,简单来讲,我们调用委托的时候,委托去调用他包含的方法列表,这样我们会感觉到我们是“直接”调用了方法,其实不然。
三·事件
那什么是事件,为什么他会和委托混淆在了一起呢?很多人以为“事件是一种特殊的委托”,甚至许多面试官都会这样认为,因为它们非常相似的。诚然,事件是基于委托的,但个人并不认为因此事件就是委托了,
微软官方也很间接的告诉了我们,事件他和委托知识类似,为什么会类似呢?因为事件是包含了委托的。下面我们详细讲讲。
1.定义
1.同样是定义,我们可以看到委托它可以定义在类的外面,而事件只能定义在类的里面,并且微软很明确的提示你“ 命名空间不能直接包含字段或方法之类的成员 ”,其实这也说明了我将要说的,委托是一种类型,事件是一种成员。
2.声明,我们可以在上面的图中看到,事件的声明用到的关键字“event”,但他在这个关键字后紧跟着的就是“EventHandler”,这个EventHandler是.NET BCL使用的,并被指定为事件使用标准的预定义委托类型。
从这很明确的看出,EventHandler是一个委托(delegate)。
含有一个方法的委托称为单播委托,含有一个以上的方法的委托称为多播委托,而事件就是建立在多播委托之上的,他们的构建非常相似,但他们并不是一回事。