您的位置:程序门 -> .net技术 -> c#



@@哪位朋友给讲讲委派和事件的使用啊,这个地方不理解!@@


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


@@哪位朋友给讲讲委派和事件的使用啊,这个地方不理解!@@[已结贴,结贴人:socreazy]
发表于:2007-03-31 13:39:16 楼主
哪位朋友给讲讲委派和事件的使用啊,这个地方不理解!最好写几句给举例说明一下啊。谢谢啦!
发表于:2007-03-31 14:06:241楼 得分:15
委托”机制的“委托”到底是什么意思呢,《高级汉语大词典》中是如下解释的:托付给别的人或机构办理。要说生活中的意思其实大家都能理解,无非是“当某人(机构)需要完成一件自己不能或不应该完成的事情的时候,此人(机构)物色一个合适的且有能力完成此事的人选,然后提供必要的信息,将此事委托给物色到的人(机构)来完成。”

    软件的对象方法其实是对现实世界的模拟,你可能会想现实世界里的委托哪有这么多呢?这么重要呢?其实你也许没有注意到老板把厚厚的一摞资料摔在你的案头让你无论如何在×月×日前交活,这不就是一种委托吗?当然也许没有委托书(和委任状),但它就是委托。这样看委托是不是就非常重要了,它甚至是构成现实社会的基础机制之一。
 
  从这个意义上理解委托机制的重要性我想应该是足够了。委托机制是促使事件发送与事件接受的一种对接策略,对象对周围信号的反应或在一定环境中所具备的对其它对象的通知行为的响应则被描述成所谓的“事件”,这可以类比人对周围世界反馈产生信号的能力。
 
  委托就是一种定向信号流:指定产生、接受信号者并产生信号反馈的技术。
 
  我可爱的小女儿才刚刚学会说话就在饭桌上支使她可怜的“老”爸:爸爸,把我的小勺子拿来。我接到“信号”立即屁颠屁颠地跑到厨房拿到勺子送到女儿的小手上,一个“委托”完成的非常漂亮,而女儿则无须知道我在什么地方、如何拿到勺子,她只管接受到我给她专门买的小勺子就行,否则,她就要仰着小脸“哇哇”大哭了。
 
  先说说事件委托的基础。
 
  为了说明问题我设计了一个窗体还有几个按钮的示例delegatedemo1项目,以便可以直观感受委托的基本用法。
 
  至于委托在.net中的实现,编译器会自动生成一个完整的类定义:一个构造器,invoke,begininvoke,以及endinvoke。
 
  c#中隐式使用invoke(其显式调用会报错)会让我们误解有一个以委托名称为名称的函数,其实没有,它只是隐式使用invoke方法。而vb.net包括最新的vb.net2005均可以采取两种方法(显式或隐式)使用invoke方法。我比较喜欢显式使用它,因为这样比较贴近事物的本质。

  回到示例,代码如下:  

public   class   form1class   form1
inherits   system.windows.forms.form
private   sub   button1_click()sub   button1_click(byval   sender   as   system.object,_
byval   e   as   system.eventargs)   handles   button1.click,_
button2.click,   button4.click
select   case   ctype(sender,   button).name
case   "button1 "
  messagebox.show( "你点击了button1! ",   "委托提示 ",   messageboxbuttons.ok)
case   "button2 "
  messagebox.show( "你点击了button2! ",   "委托提示 ",   messageboxbuttons.ok)
case   "button3 "
  messagebox.show( "你点击了button3! ",   "委托提示 ",   messageboxbuttons.ok)
case   "button4 "
  messagebox.show( "你点击了button4! ",   "委托提示 ",   messageboxbuttons.ok)
end   select
end   sub
private   sub   button2_click()sub   button2_click(byval   sender   as   system.object,_
byval   e   as   system.eventargs)   handles   button2.click
messagebox.show( "button2的click事件,注意执行顺序! ",   "委托提示 ",   messageboxbuttons.ok)
end   sub
private   sub   button3_click()sub   button3_click(byval   sender   as   system.object,_
byval   e   as   system.eventargs)   handles   button3.click
dim   demohandler1   as   demohandler
demohandler1   =   addressof   button1_click
demohandler1.invoke(sender,   e)
dim   demohandler2   as   demohandler
demohandler2   =   addressof   button2_click
demohandler2(sender,   e)
end   sub
private   sub   button4_click()sub   button4_click(byval   sender   as   system.object,_
byval   e   as   system.eventargs)   handles   button4.click
end   sub
private   sub   button5_click()sub   button5_click(byval   sender   as   system.object,_
byval   e   as   system.eventargs)   handles   button5.click
end   sub
private   sub   form1_doubleclick()sub   form1_doubleclick(byval   sender   as   object,_
byval   e   as   system.eventargs)   handles   mybase.doubleclick,   button5.click
if   typeof   sender   is   button   then
if   messagebox.show( "你确定退出吗? ",   "退出提示 ",_
messageboxbuttons.yesno,   messageboxicon.warning)   =   dialogresult.yes   then
me.close()
else   :   exit   sub
end   if
else   :   me.close()
end   if
end   sub
end   class


  button1按钮的click事件的代码只需看看handles子句,不仅有button1.click还有button2.click,   button4.click,msdn上说:在过程声明结尾处使用handles关键字将使其处理由使用   withevents   关键字声明的对象变量所引发的事件。也可以在派生类中使用handles关键字处理基类的事件。其实handles子句允许任何与事件的参数签名相符的过程来响应这个事件。这实际上就是委托。在编译时间,.net   framework用你的事件名称创建一个委托类,只是在结尾添加“eventhandler”字样。换言之,事件是使用委托来实现的,委托是面向对象函数指针的一种形式,它允许通过对函数进行引用的方法来间接地调用该函数。
 
  双击set_button1方法或其他set_...方法,你都可以看到有system.eventhandler类出现。.net   framework   中的事件模型基于具有事件委托,system.eventhandler将事件与事件处理程序连接。
 
  button1的click事件过程中的select   case…end   select功能是根据点击按钮的名称来选择事件处理程序。
 
  button3的click事件过程要好好看看的。如下:
 
                    语   句   释   义  
 
                    dim   demohandler1   as   demohandler:定义一个demohandler委托的实例,demohandler可以换成   eventhandler  
                    demohandler1   =   addressof   button1_click:addressof可以认为就是将该委托和button1_click绑定  
                  demohandler1.invoke(sender,   e):显式使用委托的invoke方法调用事件处理程序  
                  dim   demohandler2   as   demohandler:定义一个demohandler委托的实例,demohandler2  
                  demohandler2   =   addressof   button2_click:同上addressof  
                  demohandler2(sender,   e):隐式使用委托的invoke方法调用事件处理程序  
 
  button4按钮的click事件过程为空,因为在button1_click的handles子句中已经注册,且由于它们的事件签名完全一致,故调用button1_click事件处理过程。
 
  button5按钮的click事件过程也为空,不要着急,下面的form1_doubleclick事件处理过程的handles子句中注册了button5,所以button5的click事件的事件处理程序调用form1的doubleclick事件的事件处理程序。
 
  在form1的doubleclick事件处理过程使用对控件类型的判断来选择处理方式。
 
  我不说你也看出来了,这样写代码,就可以将一些本来需要重复多次的代码省去,符合重构的思想,使得代码尽量简约而由不失可读性。
 
  现实生活中委托别人办的事能不能办好取决于以下两个方面:
 
  1、是否委托给了合适的人;
 
  2、是否把解决委托事件所需的正确和必要的信息传递给了它。
 
  比如女儿委托我拿勺子,这个委托是相当成功的,因为她委托给了我(人选合适)且明确要她的小勺(正确和必要的信息传递)。
 
  对应到.net框架中的委托,一是要有委托对象,二是要签名相符。
 
引用:
 
  委托是用来处理其他语言(如   c++、pascal   和   modula)需用函数指针来处理的情况的。不过与   c++   函数指针不同,委托是完全面对对象的;另外,c++   指针仅指向成员函数,而委托同时封装了对象实例和方法。委托声明定义一个从   system.delegate   类派生的类。委托实例封装一个调用列表,该列表列出一个或多个方法,其中每个方法均作为一个可调用实体来引用。对于实例方法,可调用实体由该方法和一个相关联的实例组成。对于静态方法,可调用实体仅由一个方法组成。用一个适当的参数集来调用一个委托实例,就是用此给定的参数集来调用该委托实例的每个可调用实体。
 
  委托实例的一个有趣且有用的属性是:它不知道也不关心它所封装的方法所属的类;它所关心的仅限于这些方法必须与委托的类型兼容。这使委托非常适合于“匿名”调用。——《c#语言规范》scott   wiltamuth   和   anders   hejlsberg

发表于:2007-03-31 14:36:532楼 得分:0
我写c#,不过谢谢上面这位朋友啊,写了这么多,结帖时候一定给你分啊!!谢谢!!
发表于:2007-03-31 14:43:183楼 得分:0
我真没看懂在vb.net里面是如何声明委托的,看得眼花了都!
发表于:2007-03-31 15:48:384楼 得分:10
举个不恰当的例子,合同中约定货到付款(相当于委托),但是货还未到,钱也自然未付.其中货相当委托中约定的签名.钱相当于返回类型.

某一天,货到了,自然这个合同就要开始执行(相当于触发事件),下面的事情就顺理成章了

发表于:2007-03-31 16:03:425楼 得分:5
不安全代码就必须用委托
发表于:2007-03-31 17:18:466楼 得分:0
學習
发表于:2007-03-31 17:22:577楼 得分:10
我也不打理解委托和事件,专门写了一个及其简单的console程序,供大家一起探讨。

using   system;
using   system.collections.generic;
using   system.text;

namespace   eventtest
{
        //   delegate   is   just   a   special   kind   of   class
        //   it   is   a   signature   for   strong-named   methods
        public   delegate   void   myeventhandler(object   sender,   eventargs   e);

        public   class   myeventclass
        {
                //   event   is   very   special,   the   keyword   is   put   before   the   delagate   name,
                //   it   is   related   to   the   delegate,   delegate   provides   the   signature   for   the   allowed   methods
                //   event   has   2   basic   functions:
                //   first,   it   can   add   methods   which   should   match   the   delegate
                //   second,   it   can   invoke   those   methods
                public   event   myeventhandler   myevent;

                //   event   object   has   "+= "   operate
                //   allow   methods   to   be   stored   in   the   event   object
                public   void   addevent()
                {
                        myeventreceiver   mr   =   new   myeventreceiver();
                        myevent   +=   new   myeventhandler(mr.myspecialevent);
                }

                //   it   can   invoke   the   stored   methods   with   the   passed-on   information   from   event-raiser
                public   void   raiseevent(object   sender,   eventargs   e)
                {
                        if   (myevent   !=   null)
                        {
                                myevent(sender,   e);
                        }
                }
        }

        //   this   is   the   place   to   handle   the   event
        public   class   myeventreceiver
        {
                public   void   myspecialevent(object   sender,   eventargs   e)
                {
                        console.writeline( "really   really   dummy! ");
                }
        }

        public   class   eventraiser
        {
                static   void   main()
                {
                        myeventclass   mr   =   new   myeventclass();
                        mr.addevent();    

                        mr.raiseevent(null,   eventargs.empty);
                       
                }
        }
}
发表于:2007-03-31 18:28:418楼 得分:0
mark
发表于:2007-03-31 19:08:009楼 得分:0
顶+通俗易懂!


快速检索

最新资讯
热门点击