1. C#的委托等同于C++的函数指针 。可以 从 C++函数指针反过来理解C#委托。
2. 委托应用于“同步调用”的场景,如一个有声阅读器,打开记事本(1)并开始阅读(2),这是两个方法,但这时,我想
调用打开的方法时,同时调阅读,这时候委托就来了,把阅读这个方法作为参数传给“打开记事本”的方法。

解决方案 »

  1.   

     看一下demo 就知道怎么回事了!  http://www.cnblogs.com/stwyhm/archive/2006/08/11/474235.html
      

  2.   

    自动微软提供了Action和Fun其实基本上已经没必要自己写委托了
      

  3.   

    2.
    与一般的用法有什么区别,
    reader.open();
    reader.read();
    顺序执行不是一样的吗?
      

  4.   

            public Form1()
            {
                InitializeComponent();            //如果要引发Click事件,可以调用EventHandler委托,并传递所有与事件有关的参数(sender,e)。
                this.Click += new EventHandler(Form1_Click);
            }        void Form1_Click(object sender, EventArgs e)
            {
                throw new NotImplementedException();
            }    
      

  5.   

    我的理解如下:
    委托就是对一个方法映射,把方法名当参数来传递,类似JS中的在某个function的参数中把另一个function的名称当参数来传递。//定义委托原型
    delegate void UpdateHandler(int id);
    //定义符合委托原型的方法UpdateMember
    void UpdateMember(int id)
    {
        //更新用户逻辑
    }
    //定义符合委托原型的方法DeleteMember
    void DeleteMember(int id)
    {
        //删除用户逻辑
    }如何使用呢,如下:
    //实例化委托对象,再构造函数中把方法名当参数来传递。
    UpdateHandler handler = new UpdateHandler(UpdateMember);
    //执行委托对象
    handler(某个用户id);
    handler(某个用户id)就等价于
    UpdateMember(某个用户id)也可以连接多个相同签名的方法,组成一个委托链,当调用委托对象时,链上的方法,按映射的顺序一次被执行。如何使用呢,如下:
    UpdateHandler handler = new UpdateHandler(UpdateMember);
    handler += DeleteMember;
    handler(某个用户id);
    handler(某个用户id)就等价于
    UpdateMember(某个用户id)
    DeleteMember(某个用户id)事件的话,看看设计模式中的观察者模式。
    被观察对象中维护了一个观察者列表,这些观察者会对被观察者某个“动作”,即事件,做出各自不同的反映。
    常见的例子如下:
    某一场景下有主人,猫,狗3个对象。
    当主人“打开门”后,猫“跑开了”,狗“叫了”。
    整个过程中,主人就是被观察对象,猫和狗都是观察者。
    一旦主人触发“打开门”这个事件的话,猫狗做出不同的反映,猫“跑开了”,狗“叫了”。
    代码如下:
    public class Host
    {
    //定义委托原型
        public delegate void OpenDoorEventHandler();
    //定义委托类型的事件
        public event GoHomeEventHandler OpenDoor;
    //定义内部一个方法,在这个方法内判断,OpenDoor事件是否被其他对象注册,一旦注册了,则调用执行事件。
        protected void OnOpenDoor()
        {
            if(OpenDoor!=null)
            {
                OpenDoor();
            }
        }
        public void GoHome()
        {
            OnOpenDoor();
        }
    }
    public class Cat
    {
        public void Run()
        {
            //猫跑了
        }
    }
    public class Dog
    {
        public void Bark()
        {
            //狗叫了
        }
    }
    如何使用如下:
    Host 主人 =new Host();
    Cat 猫 = new Cat();
    Dog 狗 = new Dog();主人.OpenDoor += new 主人.OpenDoorEventHandler(猫.Run);
    主人.OpenDoor += new 主人.OpenDoorEventHandler(狗.Back);主人.GoHome就等价于
    猫.Run();
    狗.Back();当被观察者,做出某一特定“动作”(被观察者的特定“动作”,注册了N个不同对象的不同反映),观察者对这个特定“动作”做出不懂的反映。
      

  6.   

    就像那2楼说的,通过理解Button.Click事件的整个过程就会明白委托和事件了,不过得看下自定义控件,页面生命周期,回发,观察者模式,假以时日,委托和事件也就会一点点明白了。ASP.NET WEBFORM中很多用到事件的地方,看看还是有帮助的。
    很多ASP.NET程序员,觉得拖控件被人家看不起,还没弄懂委托和事件,就直接转MVC,有点可惜了。
      

  7.   

    Refer delegate相关:
    http://www.cnblogs.com/insus/tag/delegate/
      

  8.   

    尼玛,我还是学过C++的,知道函数指针是什么,但至少用了3年才真正理解委托、事件到底是什么玩意。上面已经说了很多,但你也只能理解个大概(实际上委托是个简单的东西,但如果你不用,不了解实际用法,永远无法真正理解这个东西) 你去看.net源码吧,里面大量委托,事件的应用实例,边看边想,最后你就明白了
      

  9.   

    作为一个设计原则,设计师不会在“两个工程阶段”之间设计相互纠结的所谓接口。例如你使用的成千上万种控件,例如TextBox吧,它可以暴露出TextChanged事件、KeyDown、KeyPress事件等等,你捕获这这些事件就可以交互控制TextBox,例如让用户按Enter键时实际上程序收到的是Tab键,或者例如当文本最终确认改变时你当即将录入数字更新到界面上的“汇总”区域中。显然,TextBox是在几十年前(1993年以前)就设计好的,只不过在2002年在.net上又实现了一遍而已。它不用知道你的客户程序的接口,就能跟你的程序交互操作。这一切依赖于这种“依赖倒置”的设计模式,也就是让你的程序中的各个文本框的的良好运作功能不用基于你的程序接口来设计,而是基于人家TextBox上的事件接口规范来设计即可。在你的程序中很好地设计事件,是一个“代码民工”成长为“程序设计师”的最起码的指标之一。正是因为这些需要一点头脑的设计概念,才把程序猿从只会抄写、拼凑代码的习惯中解放出来,使得程序员花同样的时间(或者稍微长一点的时间)但是可以设计出更强大10倍、更长久10倍的软件。
      

  10.   

    例如你受命开发一个组件(不管是silverlight的用户控件,还是asp.net的用户控件,或者是jQuery的插件,等等不管哪一种都一样的思路),假设我告诉你三个参数“数据库表、关键字段的名称、关键字段的值”,要求你做的这个用户控件就能自动从数据库中读取出数据记录来,并且在页面上直接产生一个标准化的“增删改查”表单。你如何发布给别人组合到他们的程序中广泛使用?你需要在接口上设计几个参数、几个属性、十几个事件,这样才能方便与发布给别人使用。而且.net软件工程师都习惯于研究你的事件触发机制和事件参数。因此事件驱动程序设计,是软件设计的基础概念。