引言:
现实生活中,我们有时候有事很忙,没办法自己直接去做,只能委托别人间接去做。比如,我今天生病了,请别人帮我带饭。在C#中,委托也是同样道理,不直接调用函数,通过委托机制间接调用函数。
我们来想象下面场景,开学了,我们遇到了一位漂亮的女生,从我第一眼看上去,我就深深的爱上了她,这就是所谓的一见钟情。可是这位女生不知道我喜欢她,我就想了几种表白的方式,第一种,口头说,感觉最简单,却十分直接与俗气。第二种,写一份信,送信给她,让她自己读信,更能体现自己的真诚。第三种,送花并大声说出来,多么的浪漫…
我们把这些表白方式抽象为表白类
使用委托前的代码
class Express
{
public void say(string name)
{
Console.WriteLine("我说:{0},我喜欢你",name);
}
public void letter(string name)
{
Console.WriteLine("信上说:我喜欢" + name);
}
public void flower(string name)
{
Console.WriteLine("我给{0}送了一束花,并说我喜欢你", name);
}
public void expresslove(string name,int mode)
{
switch(mode)
{
case 1:
say(name);
break;
case 2:
letter(name);
break;
case 3:
flower(name);
break;
default:
break;
}
}
}
你是一个害羞的人,选择了方式二进行表白
class Program
{
public delegate void expressLove(string name);
static void Main(string[] args)
{
Express lzw = new Express();
lzw.expresslove("小花", 2);
}
}
运行效果:
思考
2020年了,社会在进步,人们表白的方式越来越多,壁咚,单膝跪地,热气球,蜡烛…
每多一种方式,我的代码肯定得多添加一种函数。
但我不想写那么多的swtich case或if else。
怎么办?
委托来了
- 关键字 delegate
- 签名与委托的函数一致(返回类型,形参列表一样)
- 委托名字随便,代表一种抽象的方法类型
使用委托后的代码
class Express
{
public delegate void mode(string name);
public void say(string name)
{
Console.WriteLine("我说:{0},我喜欢你",name);
}
public void letter(string name)
{
Console.WriteLine("信上说:我喜欢" + name);
}
public void flower(string name)
{
Console.WriteLine("我给{0}送了一束花,并说我喜欢你", name);
}
public void expresslove(string name, mode function)
{
function(name);
}
}
爱就大声说出来,为你心爱的女生买花
class Program
{
static void Main(string[] args)
{
Express lzw = new Express();
lzw.expresslove("小花",lzw.flower);
}
}
不管什么新的方法,只要适合定义的委托类型,expresslove都可以间接调用
public void kiss(string name)
{
Console.WriteLine("我亲吻了{0},并说我喜欢你", name);
}
class Program
{
static void Main(string[] args)
{
Express lzw = new Express();
lzw.expresslove("小花",lzw.flower);
lzw.expresslove("小美", lzw.kiss);
}
}
运行结果:
你还可以这样
class Program
{
public delegate void expressLove(string name);
static void Main(string[] args)
{
Express lzw = new Express();
expressLove express = lzw.say;
express += lzw.letter;
express("小红");
}
}
同时使用多种方式表白
绑定
很简单,给委托变量赋值一个函数名,称为将函数绑定到委托变量上。