在c# in depth中的委托解释:
委托在某种程度上提供了间接地方法。换言之,不需要直接指定一个行为,而是将这个行为用某种方式“包含”在一个对象中。这个对象可以像其它任何对象那样使用。在该对象中,可以执行封装的行为。可以选择将委托对象类型看做只定义了一个方法的接口,将委托的实例看做实现了那个接口的一个对象。
以遗属为例。遗属由一系列的指令组成,比如“付账单,捐款,其余财产留给猫”,一般去世之前写好遗属,然后将它放在一个安全的地方。去世后,由律师执行这些指令。
委托构成:声明委托类型;必须有一个方法包含了要执行的代码;必须创建一个委托实例;必须调用(invoke)委托实例。
delegate vod mydelete(string str);
void func(string str);
mydele=new mydelete(func);
mydele(str);相当于 mydele.invoke(str);
在clr via c#中对委托的揭秘:
internal delegate vod Feedback(int32 value);进行编译后会生成一个完整的类;
如下;
internal class Feedback:System.MulticastDelegate{
//构造器
public Feedback(Object object,IntPtr method);
//这个方法和源码指定的原型一样
public virtual void Invoke(Int32 value);
//以下方法实现了对回调方法的一部回调
public virtual IAsyncResult BeginInvoke(Int32 value,AsyncCallback callback,Object object);
public virtual void EndInvoke(IAsyncResult result);
}
可以用 ildasm.exe查看生成的程序集
改类派生自 System.MulticastDelegate类行中 其中有 _target,_methodPtr,_invocationList 三个属性 非常重要,关系方法的调用及委托链的使用,具体得查看这本书。
在csdn上面有一帖很有意思:http://topic.csdn.net/u/20120602/17/aa2ecdad-c5af-4ce4-888a-89fa8486537c.html
我所理解的委托:
在我们项目中有些用到了E8工作流,发现工作流中用了委托的东西,比如:b/s端的母版页与子叶的关联中,它在母版中定义了很多的委托 ,在需要用的工作流的页面
重要+=new systemhandle(func); func();在母版页中只要用委托调用func()就可以了;这样做的好处就是你在你的子页面中的方法体中处理不同业务都可以,只要需要的参数和返回值类型相同就可以了,这样它的扩展性很高。
经常使用的用户控件,如翻页控件的使用;
还在整理中。。。