日期:2014-05-19  浏览次数:20699 次

追根究底,关于C#委托与事件.
学习C#不久,以前一直学VC的,可以说是为了找工作时多点筹码而学的,有些功利性,不过喜欢追根问底.问个关于事件的问题

基本语言要素我了解,只是觉得有些疑惑.希望各位达人帮忙提示下

委托对象定义了一个回调函数的形式,而事件又是依据一个委托创建的,那么 "事件 "存在的意义是什么?

一种委托对象只能对应一种形式的函数,一种事件对象只能对应一种形式的委托,那么直接把事件与函数关联起来不好么?为什么需要在中间加上一层?

以Windows应用程序为例,众所周知,Windows底层是基于消息驱动的,当处理消息时,省去事件一层,直接调用委托中的函数列表不是更直接?省去委托一层也是一样.

那么,是不是事件还有些别的什么我目前还不知道的特性?

Event和delegate对象全都实现了多点回调,实现了+=和-=操作符,事件对象也可以像多点委托时关联多个函数那样关联到多个委托,那么去掉它们中的任意一层不是更好?多了一个层次并没有增加可扩展性和可读性,那么这样做的意义何在?

如果事件对象可以关联到多个不同类型的委托,那就容易理解了,可是事实上事件只能依据一个已有委托来创建,而添加委托时又必须符合创建事件时的委托形式,那么,事件到底有什么特别的作用呢?

期待一直在做C#的兄弟们帮忙解释下,谢谢了先!

------解决方案--------------------
Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class).
注意within
------解决方案--------------------
委托是一种引用方法的类型,跟接口一样允许设计器把方法的定义跟实现分离。事件是使用委托来为触发时将调用的方法提供类型安全的封装,可以说事件是委托的一种特例。
委托和事件特点如下:
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起。
方法不需要与委托签名精确匹配。

事件具有以下特点:
事件是类用来通知对象需要执行某种操作的方式。
尽管事件在其他时候(如信号状态更改)也很有用,事件通常还是用在图形用户界面中。
事件通常使用委托事件处理程序进行声明。
事件可以调用匿名方法来替代委托。

其实,你可以在msdn中找到答案,微软已经给予了深刻的解释
------解决方案--------------------
事件就是委托的实例,委托的级别是类型,与class A中的A是一个级别的.
------解决方案--------------------
很简单的问题,事件是受限的委托,它不能被赋值给其他变量也不可以脱离类而存在,不能直接赋值也不能跨类调用。这样做与封装的原理是一样的。