一.本质
委托的本质是一个雷,用来定义函数的类型,是函数的容器.
不同函数必须对应和各自"格式"一致的委托.
二.基础语法
关键字:delegate
访问修饰符 delegate 返回值 委托名(参数列表);
简单记忆则是:没用函数体的函数,在返回值前加一个delegate.
通常将委托写在namespace语句块中.在类中作为成员变量使用.
委托还可以作为函数的参数.此时可以在委托执行前,在函数内做一些操作,再执行委托里的函数.
三.定义自定义委托
修饰符默认public
public delegate void MyFuc();
//这里只是定义了一个委托类,还并没有使用
public delegate int MyFuc1(int i);//委托不能像函数一样重载
//用来装载返回值为int,有一个int参数的函数的委托容器规则
四.使用定义好的委托
public void Fun()
{
}
//装载函数的容器
//写法一
MyFuc f = new MyFuc(Fun);//只传函数名,注意改函数要跟定义好的委托一样(这里是无参无返回值)
//委托调用
f.Invoke();
//写法二
MyFuc f2 = Fun;
f2();//与invoke是一样的
//使用有参有返回值的委托
public int Fun2(int i)
{
}
MyFuc2 f3 = Fun2;
f3(2);
把委托作为函数参数使用:
public void Function(MyFuc f1,MyFuc2 f2)
{
int i =2*5-3+8;
f1();
f2(i);
}
//使用
f1 = (某个函数);
f2 = (某个函数);
Function(f1,f2);
五.多播委托
委托变量可以存储多个函数
public void Fun1()
{
}
public void Fun2()
{
}
//初始化赋值时不能用+=,但若初始化时不赋值,或为null,则之后可以+=
MyFuc f1 = null;
f1 +=Fun1;
f1 +=Fun2;
//删除
f1 -=Fun2;
f1 -=Fun2;//多减不会报错
f1 = null;//置空,此后不能再调用f1了!
if(f1!=null)
{
f1();
}
六.系统定义好的委托
需要命名空间 System
//如果我们需要一个无参无返回的委托,
//则每次写脚本都要写delegate void Fun();这样的一句话,太麻烦
//系统为我们提供了一些委托
delegate void FunVoid();
//等价于Action
//使用时
FunVoid func;
//等价于
Action func;
//泛型委托
Func<string> func2;//返回值为string类型的函数的容器
//自定义泛型weituo
delegate T MyFuc3<T>(T t);
//有参数的泛型委托,(没有返回值)
Action<int> func3;//参数为int的委托
Action<int,int,int> func4;//三个int参数的委托,最多16个
//有参有返回值
Func<int,string> func5;//参数int,返回值string
资料来源<唐老狮C#教程>