委托
委托
委托是函数的容器,可以理解为表示函数的变量类型
用来存储和传递函数
委托的本质是一个类,用来定义函数的类型(返回值和参数的类型)
函数必须对应和各自“格式”一致的委托
//关键字:delegate
//语法:访问修饰符 delegate 返回值 委托名(参数列表);
//可以申明在namespace和class中,更多卸载namespace里面
//申明了一个可以用来存储无参无返回值函数的容器
//这里只是定义了规则,并没有使用
delegate void FuncTest();
//同一语句块中委托规则不能重名
//申明了一个返回值为int,有一个参数int的容器
public delegate int FuncTest2(int a);
//委托的使用
static void Func()
{
}
//func中装载了Func
FuncTest func = new FuncTest(Func);
//调用委托中装载的函数
func.Invoke();
//Func后面不能带(),因为不是调用Func
FuncTest func2 = Func;
//调用委托中装载的函数
func2();
static int Func2(int value)
{
return value;
}
FuncTest2 func3 = Func2;
func3(1);
FuncTest2 func4 = new FuncTest2(Func2);
func4.Invoke(1);
//委托常用与作为类的成员和函数的参数
class Test
{
public FuncTest func;
public FuncTest2 func2;
public void TestFunc (FuncTest func,FuncTest2 func2)
{
int i = 1;
i *= 2;
//先处理别的逻辑再执行传入的函数
func();
func2(i);
}
//添加函数
public void AddFunc(FuncTest func,FuncTest2 func2)
{
this.func += func;
this.func2 += func2;
}
//移除函数
public void RemoveFunc(FuncTest func,FuncTest2 func2)
{
this.func -= func;
this.func2 -= func2;
}
}
Test t = new Test();
t.TestFunc(Func,Func2);
//委托变量可以存储多个函数(多播委托)
FuncTest ff = Func;
ff += Func;
//这时ff中存储了两次Func,调用ff时会调用两次Func
ff();
//系统已经定义好的委托
//无参无返回值的委托
Action action = Func;
//返回值是泛型的无参委托
Func<string> funcs = FuncString;
//返回值是泛型的有n个参数的委托,参数在前,返回值在最后
Func<int,int> fun = Func2;
staric string FuncString()
{
return "";
}
//可以传n个参数的委托
static void FuncT(int value,string str)
{
}
Action<int,string> action1 = FuncT;

浙公网安备 33010602011771号