1、语法
步骤
①定义一个委托类型, 如Help
②委托类型实例化为委托实例
③定义函数(与委托类型相匹配的)
④将函数交给委托实例使用
示例一
//方法一
void MyFunc1()
{
Console.WriteLine("Hello");
}
//方法二
void MyFunc2()
{
Console.WriteLine("World");
}
// 创建委托实例,并将 MyFunc1 方法绑定到委托
var foo = new Foo(MyFunc1);
// 通过 += 操作符将 MyFunc2 方法添加到委托
foo += MyFunc2;
// 调用委托,执行绑定的所有方法;加问号为空不报错
foo?.Invoke();
// 委托声明
delegate void Foo();
示例二
void MyFunc1()
{
Console.WriteLine("Hello");
}
void MyFunc2()
{
Console.WriteLine("World");
}
Help p;
p = MyFunc1;
p();
p = MyFunc2;
p();
delegate void Help();
//委托就是一个装函数的容器
2、理解委托
普通变量存的是数据,而委托实例存的是行为
个人理解
委托就是用来装函数的
示例一:
using System.ComponentModel.Design;
void GoStation(Help do_something)
{
Console.WriteLine("去火车站");
Console.WriteLine("找到站长");
do_something();
Console.WriteLine("离开火车站");
}
void SayHello()
{
Console.WriteLine("sayHello");
}
GoStation(SayHello);
delegate void Help();
示例二
void GoStation(Help do_something)
{
Console.WriteLine("去火车站");
Console.WriteLine("找到站长");
do_something();
Console.WriteLine("离开火车站");
}
void SayHello()
{
Console.WriteLine("sayHello");
}
void HitHim()
{
Console.WriteLine("HitHim");
}
var p=new Help(SayHello);
p += HitHim;
GoStation(p);
delegate void Help();
3、委托的分类
返回类型和参数列表(类型和个数)相同就是同一种委托。
委托定义时就悄悄规范了接纳的函数
4、委托的简化
微软将委托和泛型结合到一起;
泛型是对类型的抽象,所以结合到一起后,只有参数列表中个数不同
泛型委托的种类只靠参数个数不同来区别
Action没有返回值;Func有返回值
用Action和Func来代替定义委托类型
示例
用匿名函数代替定义函数