你的位置:首页 > ASP.net教程

[ASP.net教程]通俗版说委托


  假设

  今天天气不错,挺风和日丽的...

  你心情很不错,给了老婆100.00,给了儿子100.00让他们自己去消费。


  事件一,龟儿子拿到钱后

  "烂天气,惹死老,整个西瓜中哈子",于是儿子花了20.5块买了个西瓜

    public static decimal BuyWatermelon(decimal total)    {      return total - 20.50m;     }

      Shop("龟儿子", 100.00m, BuyWatermelon);

  事件二,你婆娘拿到钱后


  看到这里,部分博友要开骂了"屌丝流年,就会写人妻与儿子的故事,滚粗博客园,不要污染园子..." 

  这都不是重点,重点是这个故事可以简单概括为,一个人给了他老婆儿子各100块让他们自己去购物,然后他们可以任意的去花这笔钱,只是最后的时候把剩余的钱显示了出来。

  其实,代码开发中的委托和现实中的委托是一个道理。比如你想买菜,然后让你儿子去买是一样,所有我们就有:

  你想买菜这个行为(定义函数“模板”);

  你知道你的儿子会买菜(儿子类定义了买菜函数,但是你不知道他怎么去买,是坐车去?还是走路去?去了哪家店?);

  然后你委托给你的儿子(将儿子买菜的行为替换了你买菜的行为),你现在可以把儿子理解成你的傀儡;

  最后就是儿子去买菜了(有的时候你需要关注儿子是不是把菜买回来了,有的时候你根本不关心什么时候回来,也就是有没有返回值)。

  现在,我们把代码放在一起来看,当然这个例子没有上升到类的层次,就是个简单的Program。

 1     static void Main(string[] args) 2     { 3       Shop("龟儿子", 100.00m, BuyWatermelon); 4       Shop("婆娘", 100.00m, BuyDurex); 5       Console.ReadKey(); 6     } 7  8  9     public static void Shop(string name, decimal total, Func<decimal, decimal> shopping/*消费*/)10     {11       var balance = shopping(total);12       Console.WriteLine("{0}购物后剩余{1:C}", name, balance);13     }14 15     public static decimal BuyWatermelon(decimal total)16     {17       return total - 20.50m; 18     }19 20     public static decimal BuyDurex(decimal total)21     {22       return total - 10.00m;23     }

View Code 

  问题

  看到这,部分博友又开始卷了“内个勒逼,直接就可以用方法,还用个毛委托”

 1     static void Main(string[] args) 2     { 3       Shop("龟儿子", 100.00m, 25.5m); 4       Shop("婆娘", 100.00m, 10); 5       Console.ReadKey(); 6     } 7  8     public static void Shop(string name, decimal total, decimal shopping/*消费*/) 9     {10       var balance = total - shopping;11       Console.WriteLine("{0}购物后剩余{1:C}", name, balance);12     }

  回答:如果你的程序就是这么简单的加减,然后打印,连Shop方法都可以省了,直接一句话输出就得了。

 Console.WriteLine("龟儿子购物后剩余{0:C}", 100.00m-25.5m);

  又有博友开卷了,“那按你的意思,是不是代码越复杂越好啊”。

  

  “好代码和复杂度有毛关系???”

  ...

  如果你现在已经看得云里雾里,不知流年扯了半天都讲了些什么屁玩意,好的,没关系,这都不是重点。

  重点是,“.Net通过使用委托来提供了一种回调函数机制”,把这句话默默的背上一百遍,你就知道什么是委托了。