文章目录
一、什么是委托?
委托是寻址方法的.Net版本,在C++中,函数指针只是指向内存位置,不是类型安全的。你无法得知这个指针实际指向什么,参数类型、返回类型也无从得知。而.Net委托是一个类型安全的类,它定义了返回类型、参数类型。从IL中看它是继承至MulticastDelegate,所以委托可以说其实就是个类。
功能上而言:当要把方法作为传送给其他方法时,就需要使用委托
C#:
IL:上图代码在IL编译后的结果,可知其继承自父类 MulticastDelegate
二、委托使用步骤
1.声明委托
定义委托就是告诉编译器这种类型的委托表示那种类型的方法
//声明一个委托
public delegate void Voiddelegate( int x);// 声明一个委托,委托所包含的方法带有一个int参数,并且返回Void
public delegate void Void_delegate();//委托所包含的方法无参数,并且返回Void
public delegate int IntDelegate();// 委托所包含的方法无参数,并且返回int
public delegate int Int_Delegate(int x);// 委托所包含的方法带有一个int参数,并且返回Void
定义委托等同于定义一个新类,所以可以在任何地方定义、加上任何修饰符public、private…
1.1实例化委托
实例化时必须传递一个和委托的参数及返回值相同的方法
IntDelegate intDelegate = new IntDelegate(test);
public static int test(){
return 1;
}
1.2委托调用
intDelegate.Invoke();
intDelegate();//两者等价,可以省略invoke
//参数①:AsyncCallback是异步完成的回调方法。
//参数②是用户自定义对象,该对象将传递到回调方法中
intDelegate.BeginInvoke(null, null);//重新开一个新线程去执行方法
intDelegate.EndInvoke(null);//检测异步调用的结果,通常放在回掉函数中
1.3委托使用场景
用于解耦、减少代码不稳定性、减少重复代码
public class A{
public delegate void Str_Delegate(string type);
public void sayCat(string type){
Console.WriteLine("cat:"+type);
}
public void say