• 学了delegate委托还有event事件的联系,基本学明白了。先总结一下吧。[转载]


    说白了,其实delegate和eventhandler之间,就是有一道纸,捅破了,就没有那么神秘了。首先我说一下我自己编程的顺序,以免大家看到网上一大堆的道理,就是自己编不出来。那是为什么呢?我给你说出来。
    首先,需要明白,delegate和event这样的程序,必须有一个发生事件的类,然后还要有一个接收一个事件并做出相应反映的类。第一个类我们就叫MySource吧,意思就是源;后面的那个类我们就叫做MyAction类吧。除了这两个类以外,还需要有一个委托类即delegate类型的类。好了,一共三个东西,即MySource类,MyAction类,Delegate类,三个,然后把他们堆砌在一起。里面先不要写东西。看到这里,没有不懂得地方吧。在你的某个XXX.cs文件里面这么写:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace DelegateEvent
    6. {
    7.    //这里写出delegate类
    8.    public Delegate MyDelegate(object sender, eventargs e)
    9.    public class MySource
    10.    {
    11.    }
    12.    public class MyAction
    13.    {
    14.    }
    15. }
    恩,看到了吗?上面。这么简单,应该不成问题吧?就是三个东西。然后呢?我们先把MyAction给充实了吧,我们就让MyAction里面有一个函数,输出一些字符串吧!
    1. public class MyAction
    2. {
    3.    public void Do(Object sender,EventArgs e)
    4.    {
    5.       console.writeline("你好,我是事件处理程序,如果你看到了,说明我被调用了。哈哈。");
    6.    }
    7. }
    看到了吧?这个事件处理程序等着MySource来调用。具体怎么调用,一会儿再说。下一步呢?我们充实一下MySource类。
    根据微软的MSDN的套路,我也建议大家看看我的MySource里面的写法。关于事件和delegate的网址是:
    http://msdn.microsoft.com/zh-cn/library/9aackb16.aspx
    如果嫌我说话啰嗦,就看msdn去,不过上面写清楚了,就是解释不清楚,对于初学者,还是看我这个啰嗦点,我认为比较好。
    上面需要注意的一点是:public void do(Object sender,EventArgs e),这是事件处理程序,这个函数的参数Object sender,EventArgs e必须要跟delegate类MyDelegate的参数一直。你看看我的,是不是一致?呵呵。
    然后呢?我们开始写MySource类,MySource类里面有三个东西需要记住,记住了就会写了。
    1,定义一个MyDelegate的一个事件成员。即在MySource里面这么写 :
    1. public class MySource
    2.     {
    3.         public event MyDelegate MyEvent;
    4.        
    5.     }
    看到了吧?都是固定写法,说明这是一个事件成员,名字叫MyEvent。
    2、需要写一个开始程序,表示程序要开始运行了。这么写:
    1. public class MySource
    2.     {
    3.         public event MyDelegate MyEvent;
    4.         
    5.         public void Start()
    6.         {
    7.             EventArgs e = new EventArgs();
    8.             OnStart(e);
    9.         }
    10.     }

    在这个开始程序里面,首先定义一个参数,这里不传递什么参数,但是也要写上。然后呢,执行Onstart(e)函数。下面写出Onstart函数

    1. public class MySource
    2.     {
    3.         public event MyDelegate MyEvent;
    4.         public void OnStart(EventArgs e)
    5.         {
    6.             MyDelegate handler = MyEvent;
    7.             if (handler != null)
    8.             {
    9.                 handler(this,e);
    10.             }
    11.         }
    12.         public void Start()
    13.         {
    14.             EventArgs e = new EventArgs();
    15.             OnStart(e);
    16.         }
    17.     }

    Onstart函数是需要一个eventArgs参数的,这就是为什么start里面是OnStart(e)。在里面,将定义的MyEvent事件成员赋值给同样是MyDelegate类型的handler,然后这个时候handler就是一个接收两个参数this,e的delegate了。好了,现在这三块砖已经搭建起来了。下面就是怎么使用了。

    在programe.cs里面这样写:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace DelegateEvent
    6. {
    7.     class Program
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             MyAction myAction = new Action();
    12.             MySource mySource = new Source();
    13.             mySource.MyEvent += new MyDelegate(myAction.Do);
    14.             mySource.Start();
    15.         }
    16.     }
    17. }

    说白了,其实很简单,首先类MyAction和MySource各定义一个实例。myAction,mySource两个。然后呢。。写出:

     mySource.MyEvent += new MyDelegate(myAction.Do); 语句。

    就是将myAction.Do的事件处理程序让MyDelegate引用,怎么使用呢?就是让mySource.MyEvent调用。mySource.MyEvent里面MyEvent是mySource的成员,当然可以这么调用。同时,在onstart里面,MyEvent给了handler,于是handler(this,e)执行的话,就等于出发了myAction.Do程序。

    明白啦?

    最后结果输出:

     

    我是一个事件处理程序,我
    请按任意键继续. . .


  • 相关阅读:
    网络结构解读之inception系列五:Inception V4
    网络结构解读之inception系列四:Inception V3
    网络结构解读之inception系列三:BN-Inception(Inception V2)
    网络结构解读之inception系列二:GoogLeNet(Inception V1)
    网络结构解读之inception系列一:Network in Network
    深度学习相关转载收集
    Person Re-identification 系列论文笔记(八):SPReID
    Person Re-identification 系列论文笔记(七):PCB+RPP
    Person Re-identification 系列论文笔记(六):AlignedReID
    Spring@Autowired注解与自动装配
  • 原文地址:https://www.cnblogs.com/beeone/p/2009873.html
Copyright © 2020-2023  润新知