本帖最后由 saynowhy 于 2011-03-05 13:20:29 编辑

解决方案 »

  1.   

    委托是一种比较特殊的类型,用它来调用的方法的签名必须与其定义的方法签名一致
    具体例子网上很多
    .Net 委托
      

  2.   

    event都可以通过delegate来完成。
    event强调了事件。通过订阅事件来获得通知
    delegate则泛指符合某种格式的函数
    EventHandler 是一个预定义的委托。
    典型的是看观察着模式。
      

  3.   

    所有的委托实际都派生自System.Delegate或System.MulticastDelegate。
    个人认为这个需要写代码实际体验下,
    真正晓得了委托带来的好处后就知道它为何物了,
    不必为概念所束缚。
      

  4.   

    同种物质:          相同方法签名
    几种食材:          多个方法,最少一个
    一个煎饼果子:      委托吃煎饼:           调用委托
    一起吃了几种食物: 实际执行了多个方法这只是委托的最简单应用,最浅显理解,如果你懂了,那你可以学习委托的高级应用,
    如异步委托,事件等我有个经验就是,理解事件的时候,通过开发winform程序可以很容易理解
      

  5.   

    简单补充说一说委托的背景吧。委托和继承,是面向对象设计中两种系统扩展手段。委托概念其实比较传统,在使用汇编语言进行大型系统开发时就常用了。在使用call指令调用其它过程时,是去查询一个“地址”表来找到其它过程(首先将要传递的数据压入堆栈),然后等这个其它过程返回时再继续。按照灵活的查表方式来调用其它过程,而不是写死的过程地址,这就完成了一定的动态扩展。在c、c++的开发中,都有很多方法可以输入一个回调函数指针,用于扩展程序功能。从windows系统一出现,上世纪90年代初期,微软为了让基于windows api的开发变得非常方便,于是聘请了专业的UI工具设计师来面向广大用户设计vb开发工具,于是出现了大量使用委托的情况。比如一个最简单的TextBox控件也有好几个事件。最基本的观点是:我们应该将多个对象组成的重要的关联系统确定为“服务-客户”模式的,既客户对象依赖于服务对象,但是服务对象不依赖于客户对象。只有这样,才能避免扯皮现象,才可能为对象之间的关系解耦。比如我们设计一个路灯类型,那么我们的路灯控制室就是路灯的客户,路灯控制室可以直接跟路灯通讯,但是路灯并不需要知道有路灯控制室这种东西存在。建立“客户-服务”模式的关联,可以大大简化系统设计。就好象提供TextBox控件的厂商不用纠结于我们如何检测输入是会否合法的程序,我们的程序调用TextBox控件而不是它调用我们的程序。然而服务如何与客户通讯?路灯如果自己发生了短路事件,如何立刻通知对这个事件感兴趣的(但是自己又根本不依赖的)客户?这就需要委托。其实设计软件时,如果考虑到软件将来要扩展,总是可以使用一种“好莱坞原则”,让依赖倒置。而.net的委托,我们可以说最明显的两个特点是:
    1. 语法直截了当。程序员只需要简单些一个变量声明,声明一个事件或者委托。而不需要额外写一个class。比如我们一旦看到继承了 INotifyPropertyChange 接口对象都知道它干什么事情,非常清晰。
    2. 委托(或者事件)的定义是在服务上声明的,而根本不依赖于客户。(你可能会看到一些所谓模式的代码,其被观察者竟然依赖观察者,要小心了)
      

  6.   

    委托定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性
      

  7.   

    我的理解委托是一种类型,和类,结构,枚举一样。
    委托用来表示一个方法,不同的委托,区别就在方法的参数类型和数量。
    支持范型以后,.net4的类库已经定义了支持十几个不同参数和返回值的委托fun和action了,所以基本上就不用自己定义这种类型,直接使用就可以了。
      

  8.   

    你可以把委托看成是用来执行方法(函数)的一个东西,委托就是把方法当参数传递!
    使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
    比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。 
    你命令小王,如果小张玩游戏,则小王扣去小张500元钱。 
    这就是现实中的委托。 
    实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。 
    所以,委托有如下几个要素: 
    1 激发事件的对象--就是小张 
    2 处理对象事件的对象--就是小王 
    3 定义委托,就是你让小王监视小张。 
    如果这三个要素都满足的话,则你就写出了一个完整事件的处理。 
    下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功: 
    using System; 
    namespace CSharpConsole 

    public class 场景 

    [STAThread] 
    public static void Main(string[] args) 

    Console.WriteLine("场景开始了...."); 
    // 生成小王 
    小王 w = new 小王(); 
    // 生成小账 
    小张 z = new 小张(); 
    // 指定监视 
    z.PlayGame += new PlayGameHandler(w.扣钱); 
    // 开始玩游戏 
    z.玩游戏(); 
    console.writeline("场景结束..."); 
    Console.ReadLine(); 

    } // 负责扣钱的人 
    public class 小王 

    public 小王() 

    Console.WriteLine("生成小王..."); 

    public void 扣钱(object sender,EventArgs e) 

    Console.WriteLine("小王:好小子,上班时间胆敢玩游戏..."); 
    Console.WriteLine("小王:看看你小子有多少钱..."); 
    小张 f = (小张)sender; 
    Console.WriteLine("小张的钱: " + f.钱.ToString()); 
    Console.WriteLine("开始扣钱......"); 
    System.Threading.Thread.Sleep(500); 
    f.钱 = f.钱 - 500; 
    Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString()); 


    // 如果玩游戏,则引发事件 
    public class 小张 

    // 先定义一个事件,这个事件表示“小张”在玩游戏。 
    public event PlayGameHandler PlayGame; 
    // 保存小张钱的变量 
    private int m_Money; 
    public 小张() 

    Console.WriteLine("生成小张...."); 
    m_Money = 1000; // 构造函数,初始化小张的钱。 

    public int 钱 // 此属性可以操作小张的钱。 

    get 

    return m_Money; 

    set 

    m_Money = value; 


    public void 玩游戏() 

    Console.WriteLine("小张开始玩游戏了....."); 
    Console.WriteLine("小张:CS好玩,哈哈哈! 我玩....."); 
    System.Threading.Thread.Sleep(500); 
    System.EventArgs e = new EventArgs(); 
    OnPlayGame(e); 

    protected virtual voidonPlayGame(EventArgs e) 

    if(PlayGame != null) 

    PlayGame(this,e); 



    // 定义委托处理程序 
    public delegate void PlayGameHandler(object sender,System.EventArgs e); public delegate void PlayGameHandler(object sender,System.EventArgs e); //定义委托处理程序 
    public delegate void PlayGameHandler(object sender,System.EventArgs e); OnPlayGame(e); "小张开始玩游戏了" 
      

  9.   

    有一本书叫 《CLR Via C#》里面讲的很清楚,可以去看看。 
      

  10.   

    你把委托理解成 一个特殊的类的公共成员变量,不同在于,它的类型是个函数,而不是其它的int,string,或自定义的类,它不但可以传值,还可以为你执行一个过程。
      

  11.   

    类似与C++中的函数指针,不同的是C++语言的函数指针只能够指向静态的方法,而委托除了可以指向静 态的方法之外,还可以指向对象实例的方法。

    委托的最大特点是:它不知道或不关心自己引用的对 象的类。

    委托的应用:回调(CallBack)机制、事件处理。

    委托的声明和使用
    例如:
    public delegate void FuncDelegate(string str);
      

  12.   

    给楼主个例子吧using System;
    namespace DelegateExample
    {
        //第一步:声明委托
        public delegate string MyDelegate(string name);
        public class Program
        {
            //第二步:定义被调用的方法
            public static string FunctionA(string name)
            {
                return "A say Hello to " + name;
            }
            public static string FunctionB(string name)
            {
                return "B say Hello to " + name;
            }
            //第三步:定义delegate类型的处理函数,并在此函数中
            //通过delegate类型调用步骤定义的方法
            public static void MethodA(MyDelegate Me)
            {
                Console.WriteLine(Me("张三"));
            }
            public static void Main()
            {
                //第四步:创建实例,传入准备调用的方法名
                MyDelegate a = new MyDelegate(FunctionA);
                MyDelegate b = new MyDelegate(FunctionB);
                MethodA(a);
                MethodA(b);
                Console.ReadLine();
            }
        }
    }