现在在看《21天学通C#》
但看到代表Delegate不是很理解,感觉云里雾里,麻烦大侠们指点一下
小弟先谢过了!~

解决方案 »

  1.   

    一开始可以看作函数指针。
    实现事件(event)机制的基础。
    可以用delegate异步调用方法。
      

  2.   

    首先你要区分 delegate 还是 Delegate,这是两个不同的东西。delegate是一个声明类型的关键字,而Delegate则是一个类型。并且Delegate是abstract的。Delegate是一个相当复杂的类(其子类,即你使用delegate声明的类当然更加复杂)。Delegate中保存MethodInfo类型的信息,如果你了解反射就知道MethodInfo、PropertyInfo、FieldInfo。他们可以用来以反射的方式执行(Invoke)或者对值操作(SetValue、GetValue)。系统中对method的存储做了一些优化,使得大量创建使用了相同类型Delegate的对象时可以少占用一些空间。不过这并不重要。知道Delegate有 DynamicInvoke 方法就行了。Delegate自身还是自身的一个集合,使用 += 的形式就可以在null、单个Delegate、多个Delegate俄集合之间自动转换类型,不需要重新定义类型。一个Delegate子类对象,在没有实例化的时候是null,然后你使用 +={一个Delegate} 对它进行操作,它就变成那个Delegate了;如果你继续 +={一个Delegate}操作,它就把那么Delegate与原来曾经合并过的Delegate再合并为更大的一个集合。-= 则是想反的操作,从集合中删除,直到剩下单个Delegate的时候就将Delegate集合类型自动变为单个的Delegate,再次 -= 就变为 null了。既然 Delegate 也可以按需变成 Delegate集合,那么上述操作中的 {一个Delegate} 也适合于 {一个Delegate集合} 的情况。
      

  3.   

    从Delegate 以及 MulticastDelegate 继承的类型非常多,例如其中一种是 EventHandler 就被很多标准控件使用。这些子类中很多都除了再提供 Invoke执行方法以外也支持异步执行,基本上都使用 BeginInvoke、EndInvoke为方法名称,但是这并不是什么公共接口或者公共父类继承的,而是各个Delegate子类自己定义的私有接口方法,尽管他们恰巧取名相同。关键字 event 将 Delegate 的 +=、-=、激活 单独独立出来,并且隐藏了其它的接口。这是编译器指令,用于隐藏庞大的Delegate定义。一旦使用 event,那么在定义这个事件的类型之外,就能把事件当作普通的 Delegate 使用了,只能使用最严格限制的三、四个操作方法。
      

  4.   

    就能把事件当作普通的 Delegate 使用  -->  就“不”能把事件当作普通的 Delegate 使用