为什么不去直接执行函数ShowWindowsMessage,而要转个弯子去执行messageTarget委托。看这两个函数:
        public static void test()
        {
            Action<string> messageTarget;            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = ShowWindowsMessage;
            else
                messageTarget = Console.WriteLine;            messageTarget("Hello, World!");
        }        private static void ShowWindowsMessage(string message)
        {
            MessageBox.Show(message);
        }

解决方案 »

  1.   

    假设程序需要多次调用ShowWindowsMessage,那么用委托的优势就来了。
      

  2.   

    是这样!举个例子不知恰不恰当.工厂车床上有个放生产产品的模具的装置(暂且这样叫吧!)他就相当于委托.
    不同产品的模具相当于不同的函数.
    在这种情况下,我安装不同的适用于委托的模具就可以生产不同的产品.另请参考,C#睡前的故事.
    http://blog.csdn.net/anyqu/archive/2008/07/27/2720724.aspx
      

  3.   


    比方说你在后面需要再次输出一些信息,如果不使用委托的话,你就需要再次判断命令行参数的数量来决定是调用Message.Show还是Console.WriteLine。这样以后修改程序的时候,可能就需要修改多次,容易出错。这里使用委托的话,后面只需要添加messageTarget("some string");这一句代码就可以了,当判断条件需要修改时,也只需要修改一次。
      

  4.   

            class Boss
            {
                public delegate double DoWork();//老板定义一个委托,叫“干活”,返回类型为工作完成度            //根据你干活的多少,表现出老板的满意程度,但老板不关心你是怎么干的活
                public void Satifaction(IEmployee e, DoWork dw)
                {
                    double d = dw();
                    if (d < 0)
                        return;
                    Console.Write("{0},", e.Name);
                    if (d == 0)
                        Console.WriteLine("你明天可以不用来上班了");
                    else if (d > 0 && d <= 0.3)
                        Console.WriteLine("你不想混了?");
                    else if (d > 0.3 && d <= 0.5)
                        Console.WriteLine("你干什么吃的?");
                    else if (d > 0.5 && d <= 0.8)
                        Console.WriteLine("小伙子,得加把劲啊");
                    else if (d > 0.8 && d < 1)
                        Console.WriteLine("不错,继续加油");
                    else if (d >= 1)
                        Console.WriteLine("加你薪水20%");
                }
            }        //定义员工接口,得有名字,而且必须得工作
            interface IEmployee
            {
                string Name { get; set; }
                double Work();
            }
            //三种类型的员工
            class Employee1 : IEmployee
            {
                public string Name { get; set; }
                public double Work()
                {
                    //很卖力的工作,不吃饭,不泡妞
                    return 0.9;
                }
            }        class Employee2 : IEmployee
            {
                public string Name { get; set; }
                public double Work()
                {
                    //老板在就做一会儿,老板不在就玩一会儿
                    return 0.5;
                }
            }        class Employee3 : IEmployee
            {
                public string Name { get; set; }
                public double Work()
                {
                    //基本就是混日子的
                    return 0.1;
                }
            }
    每个人都工作了,然后由老板来评价各位员工的工作情况:            Boss b = new Boss();
                Employee1 e1 = new Employee1 { Name = "e1" };
                Employee2 e2 = new Employee2 { Name = "e2" };
                Employee3 e3 = new Employee3 { Name = "e3" };
                b.Satifaction(e1, e1.Work);
                b.Satifaction(e2, e2.Work);
                b.Satifaction(e3, e3.Work);
    这下有点明白了?以上代码是在vs2008下写的,部分语法在vs2005下不适用,请自行修改
      

  5.   

    楼上你这个如果作为接口的演示例子  会更亮//根据你干活的多少,表现出老板的满意程度,但老板不关心你是怎么干的活
     public void Satifaction(IEmployee e)
                {
                    double d = e.Work();//不用为了委托而委托
                    if (d < 0)
                        return;
                    Console.Write("{0},", e.Name);
                    if (d == 0)
                        Console.WriteLine("你明天可以不用来上班了");
                    else if (d > 0 && d <= 0.3)
                        Console.WriteLine("你不想混了?");
                    else if (d > 0.3 && d <= 0.5)
                        Console.WriteLine("你干什么吃的?");
                    else if (d > 0.5 && d <= 0.8)
                        Console.WriteLine("小伙子,得加把劲啊");
                    else if (d > 0.8 && d < 1)
                        Console.WriteLine("不错,继续加油");
                    else if (d >= 1)
                        Console.WriteLine("加你薪水20%");
                }
      

  6.   

    还有一个更好的地方就是test()里内是另一个线程,比如你test里在正从一个数据库导入到另一个数据库,你不可能导入成功一条就停下来先把消息发了吧.这个多线程更好
      

  7.   


    呵呵,其实Satifaction方法一开始我并不打算传入IEmployee参数,而只传入DoWork参数的,后来为了同时输出员工姓名才加上去了,现在想想真是多此一举了,既然楼主要研究委托,我举的例子当然就是为了委托而委托了
      

  8.   

    委托, 好比你有个地方要调用一个函数, 但又不能确定这个函数的实现, 
    那么先定义个委托. 以便以后用到时实现..最典型的例子就是Control的事件, 
    你在写一个新Button时, 难道就知道Button Click要做什么事情了????
      

  9.   

    那现在有个客户给你提个新的需求:如果参数的数目为3,做某事1
    那lz的代码就变成
    //...
    if (Environment.GetCommandLineArgs().Length > 1)
      messageTarget = ShowWindowsMessage;
    else if (Environment.GetCommandLineArgs().Length == 3)
      messageTarget = DoSomething1();
    else
      messageTarget = Console.WriteLine;
    //...
    过了一段时间客户又说要改:
    如果为4,做某事2
    如果为5,做某事3
    如果为6,做某事4
    如果为7,做某事5
    如果为8,做某事6
    ...
    你和boss说,太多了,你忙不过来,要boss就给你一个小弟,帮你干活
    于是你就改成:
    public static void test()
    {
      Action<string> messageTarget = GetAction();
      messageTarget("Hello, World!");
    }
    public static Action<string> GetAction()
    {
      //让你的小弟慢慢的跟着用户的需求改吧,你就等着他做完就行了
    }
      

  10.   


    LZ问的是:
    A 绕弯子调用 B  为什么会这样用.你给的例子比他的清晰,利于理解.但那只是另一个委托.LZ要问的是:为什么你会用委托.
    当然,你那个场景里用委托结构优雅,确实适合用委托.你那个场景是:独自开发的时候利用委托进行优雅的设计.但恕我直言,你这样并非完全解释了委托的所有内容.委托还有一个价值是(委托是因为这个应用而诞生的):协同开发,委托就是让你写好了代码,然后给别人用.请看我的解释:鼠标单击事件: 
    MS为什么会给你限定死只有让你用委托?因为鼠标单击里面的东西肯定是很复杂的,很多乱七八糟的WINDOWS底层调用.而,MS不希望加大你的开发量,只希望让你知道:他.net自己在做侦听,而你,只需要告诉他 当他扑捉到侦听之后,他该干什么.于是,你就在他的事件方法里面写了一些 单击之后的代码. 你可以自己想象,在别人开发好的一个组件上编程,别人如果不提供类似委托这样一个东西的话.那么,对方以什么方式来调用你写的代码呢?  难道你想去配置xml?? 当然了,配置XML 同样也可以完成委托的功能. 
    比如:MS给了个XML给你,让你在里面填写好你的 单击后该执行的代码的类. 
    而你这个类必须毫无意义,毫无必要的去继承他的一个 叫做 click的鸟父类.并且实现他这个鸟父类的抽象方法:click_click .之后,你在XML的制定格式里面告诉他的的实现DLL与类名. 
    于是MS知道了他该调用什么方法. 之后:MS在他的代码里大动干戈的,浩浩荡荡的去调用你这个类....仅仅为了这一个鸟click方法... 
    当MS的.net底层代码侦听到鼠标单击这个事件之后,会去执行反射过来的子类的click_click方法.而不是如上面优雅的委托模式... 
      

  11.   


    这个得MS开源才知道.呵呵.
    最核心的部分 是由.net自己做好的. 如何实现一个鼠标动作的侦听,这个恐怕需要你从最原始的操作系统原理上来获得了.其实也不难,只是我们未涉及,也暂时没太多机会涉及.
      

  12.   

    test方法 不再依赖于 具体的ShowWindowsMessage方法现 在 是MessageBox.Show(message) 
    将来要是Print(message)
    ....在这些点上,跟接口的作用很相似接口是作用在类的级别上的
    而委托可以作用在方法级别上目标一致:实现依赖倒置,反转控制有时也需要,但不是依赖注入
      

  13.   

    从语义上来讲:老板大A,要买张车票,就委托小李去买,为什么老板不直接自己去买?
    老板大A,要开发一个楼盘,就委托勘探院去勘探水文地质、委托建筑商盖房子、委托装修公司摘装修,为什么老板不直接自己一个人干完?如果这个项目从头到尾你自己一个人干完,你可以不使用什么委托、什么OO、什么分层体系结构。
    如果这个项目大到120人月,还是你自己从头到尾一个人干完,我想说的是:    您是牛人、强人、超人。您的体力真好!
      

  14.   

    委托除了上面大家说的,还有一个作用,就是避免冗余代码
    比如我们写dal的时候,经常是try
    {
       //执行add、update等
    }
    catch
    {
       //执行log等
    }那么如果你用委托的话就可以写一个方法,其中一个参数为委托try
    {
       //执行委托
    }
    catch
    {
       //执行log等
    }其他地方就不要try了