当前位置: 代码迷 >> C# >> 浅显版说委托
  详细解决方案

浅显版说委托

热度:90   发布时间:2016-05-05 03:24:02.0
通俗版说委托

  假设

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

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

  然后,你发现钱包空了,“卧槽,哥他妈就200块钱,都给出去了,还让不让人活了”,立马给儿子和老婆,打电话,只是电话里一直,“嘟,嘟,嘟...”。

  然后,就没有然后了...

  这都不是重点,作为一个天生励志的程序猿,眼里一切只有代码

1         public static void Shop(string name, decimal total, Func<decimal, decimal> shopping)2         {3             var balance = shopping(total);4             Console.WriteLine("{0}购物后剩余{1:C}", name, balance);5         }

  事件一,龟儿子拿到钱后

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

        public static decimal BuyWatermelon(decimal total)        {            return total - 20.50m;         }
            Shop("龟儿子", 100.00m, BuyWatermelon);

  事件二,你婆娘拿到钱后

  “好不容易儿子不在家,好久没有啪啪啪...”,于是,老婆买羞羞去了

        public static decimal BuyDurex(decimal total)        {            return total - 10.00m;        }
   Shop("婆娘", 100.00m, BuyDurex);

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

  这都不是重点,重点是这个故事可以简单概括为,一个人给了他老婆儿子各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通过使用委托来提供了一种回调函数机制”,把这句话默默的背上一百遍,你就知道什么是委托了。

  相关解决方案