1.什么是事件和委托
委托和事件在.NET Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
事件就是一个特殊的委托,委托和事件就类似于字段和属性的关系,事件是对委托做了一个封装。
参考:/view/1935199.htm
2.什么是事件和委托
委托实质上是一个类,是对方法的封装,委托内部有三个重要成员:目标,方法,前一个委托。
普通代码里这样调用方法: aBird.Fly(); 封装到委托里,aBird 就是目标,Fly 就是方法。委托可以组成链,“前一个委托”用于支持这种链式结构。
MethodInvoker mi = new MethodInvoker(aBird.Fly); mi(); 这段和上面的 aBird.Fly 是一个效果,但不是直接调用。可以将 mi 传递到其他地方,再进行调用。
委托在方法和调用方之间建立了间接性。 事件是基于委托的通信机制。
如果一个对象的状态改变了,我们可能希望将这种改变通知给外界。从实现角度看,“通知”其实就是调用接收方的方法。
困境在于,我们不知道谁对这些改变有兴趣,有多少人对这些改变有兴趣,所以,我们无法直接调用方法。.net中有两个办法解决这个问题,接口和委托。
这两个的含义都是“约定”,目的则是“分离”,换句话说,就是:商量好了,分头行动。接口是对类成员的约定,委托是对参数和返回值的约定。
对于简单的通知,接口有些麻烦,委托更好一些,所以,我们将一个委托加到类中,让它保存应该调用的方法。但光秃秃的一个字段有点难看,好像没穿衣服一样。
为了让代码更好看,.net 引入了事件的概念。事件本质上是一个方法,事件提供 add, remove,将方法挂到这个委托中,或从此委托中移除。
像这样: button1.Click += new EventHandler(button1_Click), 订阅事件, button1.Click -= new EventHandler(button1_Click), 退阅事件, 如果A订阅了B的事件,那么它们之间的引用关系是这样:B引用委托,委托引用A。这就是说,在退阅事件之前,A不会被当作垃圾回收,因为B包含对它的引用。
因此,委托和事件的区别是:委托与类,结构,接口,枚举是一类,而事件属类成员,和属性,方法,字段是一类。不过这种区分意义不大,应付考官而已。
写代码的时候,谁会想这么多。
3.委托书怎么写
授权委托书
委托人:姓名、性别、出生年月、民族、工作单位、职业、住址。 (委托人为单位的,写明单位名称)
被委托人:姓名、性别、出生年月、民族、工作单位、职业、住址。
(被委托人是律师的,只写姓名和所在律师事务所名称)
委托人因XXXX(写明事件性质及对方当事人)一事,委托XXX为XX的代理人,代理权限如下:
(委托刑事案件的辩护人,只写“为被告人XXX(姓名)XXX一案第X审进行辩护”)
(委托经济、民事、行政等案件代理人的,须写明代理权限,特别授权的,应写明授权的具体范围,如
代为起诉、提出反诉、进行和解、撤诉、上诉、签收法律文书等)
委托人:(签名或盖章) 被委托人:(签名或盖章)
4.请问前辈们怎么学习委托和事件呢
委托的注意事项
在C#中,所有的委托都是从System.MulticastDelegate类派生的。
委托隐含具有sealed属性,即不能用来派生新的类型。
委托最大的作用就是为类的事件绑定事件处理程序。在通过委托调用函数前,必须先检查委托是否为空(null),若非空,才能调用函数。
在委托实例中可以封装静态的方法也可以封装实例方法。
在创建委托实例时,需要传递将要映射的方法或其他委托实例以指明委托将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。只有当两个委托实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。
5.委托与事件
public CoreTypes.NodeCallBack NCallBack;
其实就是一个字段,这个字段类型是NodeCallBack,字段的名字叫NCallBack
如果你这样声明
public event CoreTypes.NodeCallBack NCallBack;
就会定义一个事件,事件也是属于这个委托类型的,但是他与这个委托类型的字段是有区别的,这个事件在类外面访问的时候,你是不能引发,或者说主动执行的,而声明为一个public字段的话,在类的外面就可以随意操作了
最后一句是给这个字段中包含的委托添加一个匿名方法
回答补充:
二楼说的没错,我再补充一下
使用event声明的是一个事件,实际上在编译的时候会生成两个方法(add_XXX和remove_XXX)和一个字段,你在类内部使用+= -=其实编译的时候调用的是两个方法,而取出事件中包含的委托则编译时直接访问字段
但是在类的外面,你只能使用+= -=访问add和remove方法,这样就防止在类的外部直接修改委托中注册的处理器,保护类不被恶意破坏,而也仅能在内部引发一个事件