委托(delegate)
什么是委托?
首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
如何使用委托?
在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
关键字 : delegate
委托一般定义在类的外部 和类平级 一般使用public进行修饰 为的是方便调用
若定义在类的内部 则必须通过调用该类的成员才能取得其委托的引用
Calss A{
//委托声明在类内部
private delegate void Test(int a);
public void start(){
//不能声明在方法内部
// private delegate ...
}
}
委托是一种特殊的类 和普通类不同的是 委托是对一类方法的抽象。
因此只能在类的内部定义内部类(包括委托,结构,枚举),而不能在方法中定义。
//声明一个泛型委托
public delegate T Del_Test<T,R>(T t,R r));
//声明一个MathDispose类 包含一个方法
public class MathDispose{
public static float Sum(float a, int b){
return a + b;
}
}
public class A{
public static void Main(string[] args){
//实例化委托
Del_Test<float,int> del = MathDispose.Sum;
//执行委托返回float类型的值
float f = del(10,20);
Debug.Log(f);
//Debug.Log(del(10,20));
}
}
接口 是定义一套标准 然后由实现类来具体其中的方法,所以说接口是一组类的抽象。
同理:委托可以理解为 方法的抽象,也就是定义一个方法的模板,至于方法具体怎么样,由自己实现。
接口的最大好处就是可以实现多态,同理,“委托”是可以实现方法的多态。
//定义一个委托
public delegate void SaySomething(string name);
//上面 是无返回值 含有一个string类型参数的委托。
// 如果某个方法 需要委托其做事情 ,就必须遵守上面的规则
// 定义具体的方法
public void SayHello(string name){
Console.WriteLine("Hello" + name );
}
public void SayNice(string name){
Console.WriteLine("nice to meet you " + name + "!");
}
//上面具体方法 同样没有返回值 并且参数为 string类型 和我们定义的委托一致。
//这样我们便可以实例化一个委托 帮我们去调用这个方法。
Action 委托 —无返回值 参数0-16
Func 委托 ----有返回值 参数0-16
事件(event)
//定义一个事件
public event SaySomething come;
我们定义的这个是事件是有人来了, 使用关键字event进行定义 ,除此之外我们加上了前面定义的委托名,意思是说:这个事件会和SaySomething 打交道,并且 当这个事件发生的时候,会通知我的这些委托,再由委托去调用具体的方法。
//定义一个测试方法
public void Test(){
//实例化委托
SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayNice = SayNice;
//将委托添加到事件上
come +=sayHello;
come +=sayNice;
//出发事件
come("张三");
//以上代码还可以简写为:
//come += SayHello;
//come += SayNice;
//come("张三");
//因为我们在事件中已经指定了委托 所以可以省略 委托实例化的过程。
}