事件一直搞不清楚,今天仔细的研究了下,似乎有点明白了,但还是不很清楚。以下是我的理解,希望懂的人看一下我的理解是否正确,不对的地方请指正:比如某个类需要接受鼠标的操作,那么,在实例化的时候,在构造函数里就要向鼠标订阅事件【虽然不知道如何订阅鼠标事件,但感觉应该类似Mouse.Click += new EventHanle(Function)这样,不知是实际应该如何?】,然后,当鼠标有所动作的时候,就会由该操作的方法中的一条语句触发事件,然后该事件就依次调用添加到它上面的每个委托,委托则调用相应的事件处理方法。除此之外还有个疑问,实例化一个对象的时候向鼠标订阅了事件,那么当该实例销毁的时候是否要取消订阅呢?若需要,如何取消?

解决方案 »

  1.   

    Mouse.Click -= new EventHanle(Function)
      

  2.   

    1. 事件即是回调。 订阅鼠标事件的说法我不是很清楚,我们对于鼠标用得比较多的是 OnClick 事件2. 事件触发时,会依次调用订阅了事件的每个委托。如果委托有返回值,则事件会返回最后一个返回值。3. 如果订阅者没有取消订阅事件,那么订阅者实例不会被GC回收,取消的话,跟+相反,用 -,即
       
       Button1.OnClick -= Function
      

  3.   

    2005 以后就不需要
    Mouse.Click += new EventHanler(Function) 的式了直接 Mouse.Click += Function就行了
      

  4.   


    感谢你对我问题的细心回答。老实说,我又冒出些疑问……可能罗嗦了点,希望可以再得到一些回答1.回调这词有看到过,没仔细看,看来还得补补课。OnClick事件的话是说类似Button1.OnClick 的事件么?也就是说向Button1订阅事件了吧。但是Button1要接受鼠标的点击,必然是要向鼠标订阅事件的吧我想。比如我们自己要写个控件,就得自己向鼠标订阅事件了吧。还是说鼠标的点击不是以事件方式进行的呢?说起来“消息”这个东西我还不知道到底怎么回事,也得补补了……不过我现在的理解是消息就是事件机制,不知道对不对?2.“如果委托有返回值”,据我所知,事件接受的委托不是必须是Void的么?我弄错了么?可以有返回值?3.我知道我问的太多了,但是作为一个菜鸟我还想问:如果我没有取消订阅的操作,而程序被关闭了呢?这个对象会一直占着资源么?或许问出这样的问题是其他什么东西还不懂的原因,希望可以得到指教……
      

  5.   


    所谓回调,其实很简单,好比是这样,我不知道你什么时候会结贴发分数,但我希望你结贴时能通知我一声,怎么通知呢? 于是我先给你我的email,你结贴时,先查找一下我给你的email地址,然后发个邮件,这就是回调了。 也就是,我想知道你的信息,给你提供一个返回信息的渠道给我,然后你使用这个渠道联系我,这就是回调。OnClick 正式你说的意思。你说向鼠标订阅事件,这种想法我认为比较好,但实际上C#里还是Windows机制,鼠标事件是通过消息发送给控件的,我们并不能直接“订阅”鼠标事件。回调和消息是不同的,给你推荐几篇文章看看:1. 事件处理模式
    http://www.soft-bin.com/html/2010/07/07/%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e6%a8%a1%e5%bc%8f.html2. Windows消息机制
    http://www.soft-bin.com/html/2010/07/07/windows%e6%b6%88%e6%81%af%e6%9c%ba%e5%88%b6.html3. C#中调用Win API函数   (可以用这个来理解下C#和消息机制的关系)
    http://www.soft-bin.com/html/2010/07/15/csharpcallwinapi.html
    是可以有返回值的,我们定义delegate的时候,可以定义返回值,比如:
    public delegate int Add(int, int);咱们搞技术的又不是混黑社会的,知道得多点不会危险,有问题就应该问,呵呵。
    程序关闭,会释放进程所占用的所有资源,所以这个是不需要担心的。你需要担心的只是不停地订阅某个事件,却不取消,而造成订阅了事件的对象无法在程序周期内释放,但实际上这个问题对于一个新手来说,也无需考虑那么多了,呵呵
      

  6.   


    再给你推荐一篇文章吧:C#2.0中使用匿名delegate
    http://www.soft-bin.com/html/2010/07/16/delegate_in_csharp.html
      

  7.   

    NET的事件模型实际上是一种特殊委托
    定义事件的对象才可以触发事件,通过订阅事件来获得通知
    一个事件可以被多次订阅
      

  8.   

    散沙大人那些都是自己的文章……太牛了!
    那个网站很不错,简洁但不简单,就连那个tag的flash也是简洁而不简单。
    不过我看起来相当吃力啊……现在想要完全看明白是不能了,看懂多少算多少吧,然后基础学好再来看……再次感谢散沙大人,同样感谢其他回答我问题的同志们!这次的分就给散沙大人了,60分也没什么好分的……
    而且作为一只菜鸟,一直都只问问题,这是我最后的60分了……
    看来要想办法赚点可用分了……
    就此结贴。