在一个B站UP主 梁叔跟你聊 视频课学到的,
第一步:定义委托类型
delegate void Help();
第二部:实例化委托
Help h;//生成委托实例
h = SayHello;//赋予委托实例合适的函数或功能
h();//实例化该对象
void SayHello()
{
WriteLine("Hello");
}
这里大家会发现这样和一个函数一样,但是函数调用后一般无法回调,利用委托就是存放一个行为了
此时再添加一个行为
h = SayBye;
h();
void SayBye()
{
WriteLine("ByeBye");
}
再举一个例子,比如我们设定了这样一个函数,
void GoStation(Help do_sth)
{
WriteLine("去火车站");
WriteLine("找到站长");
do_sth();
WriteLine("离开火车站");
}
一个人要去火车站do_sth,要干什么呢,我们可以定义Help委托里的具体对象,比如:
GoStation(SayHello);
于是,代码输出为
因此,我们可以在里面放置各种不同的行为,比如我们也可以新建一个
void HitHim()
{
WriteLine("打他一顿");
}
GoStation(HitHim);
总结:
我们的委托其实在定义的时候就已经规范了能接纳的函数
委托的使用就是先定义委托类型,然后实例化,然后定义与委托相匹配的函数,最后交给委托实例进行使用
委托的简化:
微软在对委托进行了一些简化,比如我们可以不需要直接定义委托,在上面的代码中,我们可以直接把
delegate void Help();
注释掉,然后改为:
void GoStation(Action do_sth)
{
WriteLine("去火车站");
WriteLine("找到站长");
do_sth();
WriteLine("离开火车站");
}
void HitHim()
{
WriteLine("打他一顿");
}
可实现同样的效果
最后我们还可以对他进行一个简化,比如
使用匿名函数或者lamba表达式
void GoStation(Action do_sth)
{
WriteLine("去火车站");
WriteLine("找到站长");
do_sth();
WriteLine("离开火车站");
}
GoStation(() => WriteLine("打他一顿"));