委托(delegate)
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递(定义完成之后它就是一种数据类型);简单的说,委托是一种类型,用于传递一个函数的引用;
优点:这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托的声明
:
在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象。在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后,创建该委托的实例。
使用delegate关键字定义委托的语法如下:
delegate void IntMethodInvoker(int x);
代码含义:
定义了一个叫做IntMethodInvoker的委托,这个委托是一个可以是返回值为空,含有一个参数int的这一类函数的引用(具体指向那一个函数,需要将委托实例化);
void代表委托的返回值类型,
参数代表要委托的一类函数的参数
定义一个委托要定义方法的参数和返回值,使用关键字delegate定义。
定义委托的其他案例:
delegate double TwoLongOp(long first,long second);
delegate string GetAString();
委托的实例化:
方式1:使用new关键字实例化,括号里传递与委托对应的方法名;
delegate string GetAString(int a,int b);//定义了一个返回值为string的委托 GetAString a=new GetString(Sum);//实例化了一个GetASting委托,它用来指向i.tosting()方法(也可以说是 //i.tostring()方法的引用 //委托实例引用的方法 string Sum(int a,int b){ return (a+b).tostring; }
方式2:直接=赋值
delegate string GetAString();//定义了一个返回值为string的委托 GetAString a=Sum; string Sum(int a,int b){ return (a+b).tostring; }
委托实例的实现:
方式1:直接使用委托实例名加实参(就是把委托所指向的方法名换成实例名称即可)
delegate string GetAString();//定义了一个返回值为string的委托 GetAString a=Sum; string s=a(3,4);
方法2:使用委托下的Invoke方法调用;
delegate string GetAString();//定义了一个返回值为string的委托 GetAString a=Sum; string s=a.Invoke(3,4);
将引用类型作为函数的参数
形参:已声明的委托类型
实参:可以本新参所引用的方法名称
一般的,
被引用的方法(实参)通过引用在
函数体中得到调用
class program{ delegate string GetAString(int a,int b);//定义了一个返回值为string的委托 //委托实例引用的方法 string Sum(int a,int b){ return (a+b).tostring; } //使用委托类型作为参数的函数 string UseDel(string methodName,Getsting ga){ return ga(1,2)+methodname;//委托方法在函数体中的实现 } static void main(string args[]){ string s=UseDel("UseDel",Sum);//Sum函数名作为实参 } }
unity学习交流群:735645445