ID #34032

C#

  delegate委托,理解这个概念最好不要单纯从字面意思去简单的理解。其它的事物也一样。delegate是一种思想,或称为解决议案。因为程序本身的一些特殊的地方,使得正常的结构不能满足要求。比如:在启动一个新的线程时,这个线程要和当前的主线程并发或并行的执行,那么必须给这个线程指定它开始执行的方法入口点。这个入口点如何指定?因为正常的程序执行都是存放在堆栈中的(有关堆栈,堆相关内容已经在C#__class一文中重点讨论了),是按照先进后出,后进先出的顺序来进行的。那么如果程序要跳出这个堆栈,即以一个新线程开始工作,那么这个入口地址就不能按照堆栈这种顺序来了,实现不了。那怎么办?故人们想出了解决方案:delegate。很多语言都会实现它的功能,即产生一个函数指针。在实例化一个delegate之后,就已经确定了这个方法的地址。这也就是为什么该入口方法可以是static或non-static类型都可以的原因。(有关static和non- static相关内容已经在C#__static一文中重点讨论了。)另外一个例子就是事件。因为在程序运行中,用户的各种操作都有可能要去完成一定的功能,而要完成功能,就必须调用方法。那么这一过程也打破了程序本身的堆栈式结构。它必须跳出这个结构,去执行任意的方法。如何才能访问到这任意的方法?和上例同理。

     综上所述:delegate就是实现了函数指针,能够使程序跳出常规执行顺序,去执行一些只有在运行期间才能确定该执行哪些方法的情况。这是我一点粗浅的理解,希望广大网友提出不同的意见。

     补充:启动新线程需要使用两个Framework已经定义好了的委托:ThreadStart和ParameterizedThreadStart。这两个委托有共同特点就是指定的方法无返回值,这也是程序结构所确定的。另外,ThreadStart指定的方法无参数;ParameterizedThreadStart有一个object类型的参数。这样的话,问题就来了,如果要想传多个参数怎么办?如果想让委托指定的方法执行完,再执行某些特殊的方法怎么办?给出一个方案就是:封装一个帮助类,构造函数可以带多个参数,然后在构造函数中把这些参数赋给成员变量,这样这个类中的委托指定的方法就可以使用这些参数了。这是一个间接实现的过程。另外ParameterizedThreadStart的object类型参数,可以传一个对象过去,那么参数的问题就简单了。这是一个直接实现的过程。如果想该委托指定的方法完成后,再去执行某些特殊的方法,只要在构造函数中再加个委托作为参数,并把这个委托赋给成员变量,那么就可以实现。这样多线程和委托的关系就走通了,程序活起来了。


2009-09-25 00:00
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

C#中的委托与事件[翻译]

C#中Delegate浅析与思考

C#-委托和事件

C#多线程-不同线程之间通过事件委托封送调用方法

c#中的委托和事件的简单实例