Q-->question        A-->answer        M-->mention
          The Chapter 15th  Delegate

M:委托链(用于多播委托)=>其实质就是一个委托引用的_invocationList数组,其保存着另外几个委托对象,回调时,遍历此数组回调其中的每一个方法

M:如果委托有返回值,则其得到的结果为最后一个委托的方法的返回值,同时,C#为委托类型实例提供了+=和-=的操作符重载,对应于Combine()和Remove()方法,而委托变量直接回调则是隐藏了Invoke()

Q:如何对委托链进行更多的控制?
A:其可显式调用 Delegate[] GetInvocationList(),它可用于调用其中的每个委托,并使用符合自己的算法


Q:C#中为委托提供了哪些便利语法?
A:1.不需要构造委托对象
  2.不需要定义回调方法(可用匿名方法),给出方法体即可,其方法没有任何访问限定符,始终是私有的,其是实例还是静态则取决于是否访问了实例成员(代码超过三行则不使用)
  3.不需要指定回调方法的参数(在回调代码未引用任何参数前提下)
  4.不需要将局部变量封闭到类,即可将它们传递给回调方法

M:如果在编译时不知道委托的这些必要信息,可以使用反射来创建并调用一个委托,实现如下=>
   Delegate CreateDelegate(Type type,MethodInfo info)
   Delegate CreateDelegate(Type t,MethodInfo m,Boolean b)

Q:委托的实质是什么?
A:其实质是一个类定义,其提供了=>
  1.四个方法  构造器,Invoke(),BeginInvoke(),EndInvoke()
  2.三个字段  _target, _invocationList, _methodPtr

posted on 2007-06-19 13:58  晓木  阅读(156)  评论(0)    收藏  举报