假设

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

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

下载

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

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

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

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

事件一,龟儿子拿到钱后

"烂天气,惹死老,整个西瓜中哈子",于是儿子花了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。

static void Main(string[] args)
{
Shop("龟儿子", 100.00m, BuyWatermelon);
Shop("婆娘", 100.00m, BuyDurex);
Console.ReadKey();
}

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

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

public static decimal BuyDurex(decimal total)
{
return total - 10.00m;
}

[v_blue]问题[/v_blue]

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

static void Main(string[] args)
{
Shop("龟儿子", 100.00m, 25.5m);
Shop("婆娘", 100.00m, 10);
Console.ReadKey();
}

public static void Shop(string name, decimal total, decimal shopping/*消费*/)
{
var balance = total - shopping;
Console.WriteLine("{0}购物后剩余{1:C}", name, balance);
}
回答:如果你的程序就是这么简单的加减,然后打印,连Shop方法都可以省了,直接一句话输出就得了。

 

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

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

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

...

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

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

届ける言葉を今は育ててる
最后更新于 2017-10-13