委托是是什么
委托是 函数(方法)的容器
可以理解为表示函数(方法)的变量类型
用来 存储、传递函数(方法)
委托的本质是一个类,用来定义函数(方法)的类型 (返回值和参数的类型)
不同的 函数(方法)必须对应和各自”格式”一致的委托
基本语法
关键字:delegate
语法: 访问修饰符 delegate 返回值 委托名(参数列表);
写在哪里?
可以申明在namespace和class语句块中
更多的写在namespace中
简单记忆委托语法 就是 函数申明语法前面加一个delegate关键字
定义自定义委托
访问修饰默认不写 为public 在别的命名空间中也能使用
private 其它命名空间就不能用了
一般使用public
申明了一个可以用来存储无参无返回值函数的容器
这里只是定义了规则 并没有使用delegate void MyFun();
委托规则的申明 是不能重名 (同一语句块中)
表示用来装载或传递 返回值为int 有一个int参数的函数的 委托 器规则
public delegate int MyFun2(int a);
委托是支持 泛型的 可以让返回值和参数 可变
public delegate T MyFun3<T,K>(T t,K k);
使用定义好的委托
委托变量是函数的容器
委托常用在
1.作为类的成员
2.作为函数的参数class Test { public MyFun fun; public MyFun2 fun2; public void TestFun(MyFun fun,MyFun2 fun2) { //先处理一些别的逻辑 当这些逻辑处理完了 再执行传入的函数 int i = 1; i += 1; //直接调用 //fun(); //fun2(i); //存储 this.fun = fun; this.fun2 = fun2; } } internal class Program { static void Fun() { Console.WriteLine("1323"); } static int Fun2(int value) { return value; } static void Main(string[] args) { //专门用来装载 函数的容器 MyFun fun = new MyFun(Fun); //调用 fun.Invoke(); //另一种写法 MyFun fun2=Fun; fun2();//调用 MyFun2 fun3=Fun2; fun3(1); MyFun2 fun4 = new MyFun2(Fun2); fun4.Invoke(1); Test test = new Test(); test.TestFun(Fun,Fun2); }
委托变量可以存储多个函数(多播委托)
如何用委托存储多个函数
//增 MyFun f = Fun; f += Fun3; //删 //多减不会报错 无非就是不处理而已 f -= Fun3; //清空 //为空时调用会报错 f = null;
系统定义好的委托
Action 无参无返回值
Func<> 可以指定返回值类型的 泛型委托
可以传n个参数的 系统提供了 1到16个参数的委托 直接用就行
Action<T,T2,T3...>
可以传n个参数的 并且有返回值的 系统也提供了 1到16个参数的委托
Func<T,T2,...,TResult> 前几个都是参数 最后一个是返回类型
总结
简单理解 委托 就是装载、传递函数的容器而已
可以用委托变量 来存储函数或者传递函数的
系统其实已经提供了很多委托给我们用
Action:没有返回值,参数提供了 ~16个委托给我们用
Func:有返回值,参数提供了 ~16个委托给我们用