目录
1.概念
2.自定义的委托
3.系统定义的委托
4.委托和事件的区别
1.概念
数组我们都知道是一组数据的容器,而委托很相似,不过它是一组函数的容器。
如果把调用一次函数看做释放一个技能,那调用一次委托则是释放一套技能连招
下面看看我们应该如何使用委托
2.自定义的委托以及其用法
using System.Runtime.Intrinsics.Arm;namespace Delegate_Event
{//定义自定义委托//访问修饰默认不写为public在别的命名空间中也能使用//private其它命名空间就不能用了//一般使用public//声明一个无参数无返回值的委托容器public delegate void MyFun1();//声明一个有参数无返回值的委托容器public delegate void MyFun2(int val);//声明一个有参数有返回值的委托容器public delegate string MyFun3(int val);class Test{//用法一:在类中做参数MyFun1 fun1;MyFun2 fun2;//用法二:做参数public void TestFunc1(MyFun1 fun1, MyFun2 fun2){this.fun1 = fun1;this.fun2 = fun2;}//用法三:做返回值public MyFun1 TestFunc2(){return this.fun1;}}internal class Program{static void Main(string[] args){//委托容器只能装载与它声明时返回值和参数类型相同的函数//初始化方法一MyFun1 a1 = new MyFun1(Func1);MyFun2 b1= new MyFun2(Func2);MyFun3 c1 = new MyFun3(Func3);//初始化方法二MyFun1 a2 = Func1;MyFun2 b2 = Func2;MyFun3 c2 = Func3;//这时候我们只是创建好一些委托并初始化,但是还没有调用,因此控制台上看不到任何内容//调用方法如下//调用方法一a1.Invoke();b1.Invoke(1);c1.Invoke(2);//调用方法二a2();b2(11);c2(22);//之前在概念中我们提到,委托它是一组函数的集合,因此它应当能够添加更多的函数进来//添加或者删除函数方法如下a1 += Func1;b1 += Func2;c1 += Func3;//这时候a1,b1,c1里面都是存储了两个func函数,因此在调用一次它们时会调用两个对应函数//当然不是只能添加同一函数,只要参数和返回值类型相同的函数都可以添加a1 += Func11;//当委托里的一些函数我们不需要,需要删除函数时,方法如下a1 -= Func1;b1 -= Func2;c1-= Func3;//如果委托里的所有函数都不需要了,可以采用下面这样方法a2 = null;b2 = null;c2 = null;Console.WriteLine("------------------------");Test test = new Test();test.TestFunc1(Func1,Func2);test.TestFunc2();}static void Func1(){Console.WriteLine("无参数无返回值函数func1");}static void Func2(int a){Console.WriteLine("有参数{0}无返回值函数func2",a);}static string Func3(int a){Console.WriteLine("有参数{0}有返回值函数func3", a);return "我是Func3";}static void Func11(){Console.WriteLine("无参数无返回值函数func11");}}
}
3.系统定义的委托
像上面那种自定义委托,我们每需要一个新的委托类型时,就需要新声明一个委托类型,这样子不仅我们写起来很麻烦,而且当别人看我们写的代码时也会一头雾水——MyFun1到底是一个什么参数和返回值类型的委托?当我们看到很久以前自己写的代码,估计也会这样问。因此,接下来将介绍两种系统帮我们定义的委托类型
1.Action(无返回值类型)
参数可以根据需求选择添加,最多支持16个参数(一般用不到这么多),也就不足为虑尔
//定义一个无参数无返回值类型的委托Action a;//定义一个有参数无返回值类型的委托Action<int> b;Action<int, string,int ,int> c;
2.Func(有返回值类型)
在传入的参数中,我们选择最后一个作为返回值类型,因此至少要传入一个参数
//定义一个无参数有返回值类型的委托Func<int> d;//定义一个有参数有返回值类型的委托Action<int,int> e;Action<int, string, int, int> f;
4.委托和事件的区别
委托我们了解这么多了,那接下来该说说事件是什么,它们两个为什么会放在一起讲
事件其实就是特殊的委托
它特殊在哪里呢?且听我细细道来
首先声明方式不同:
//声明委托Action a1;Func<int> b1;//声明事件event Action a2;event Func<int> b2;
需要在开头加上event
其次它们在使用上完全一致,没了
没了?????
怎么可能!!!!!!!!!!!
确实不可能,肯定还是有点略微的不同
1.事件不能在主函数中定义(它只能作为成员存在于类or接口or结构体中)
2.事件不能在类外部被赋值(+=和-=还是可以用滴)
3.事件不能在类外部被调用
ok,本文结束
博客得来终觉浅,绝知只能自己写,看完一定要动手敲一敲,不然等于没看。