一、委托的声明和使用
介绍:委托是一种类型安全的类,他定义了返回类型和参数类型,委托类不仅包含对方法的引用,也可以包含对多个方法的引用。
使用场合:委托把方法当作参数使用,用于给一个方法传递另一个方法。有这种情况,有些方法的操作不是针对数据进行的,而是要对另一种方法进行调用,但是这种方法只知道他的返回类型和参数类型,至于具体的操作只有在运行的时候才知道,此时可以使用委托将方法当做参数传递。
委托的声明:使用关键字 delegate,其他部分类似于方法的声明,只不过没有方法体。如:delegate void MyDelegate(int x),指定该委托的实例都可以包含一个或多个方法的引用,该方法无返回值,有一个 int 类型的参数。
注意:
1、在定义委托的时候必须要表明他所表示的方法的返回类型和参数列表,和类的使用类似,先声明一种类型的委托,然后创建该委托的一个或多个实例;
2、因为定义一个委托实际上是定义一个新类,所以可以在定义类的任何地方定义委托,可以在类的内部和外部,可以使用访问修饰符:public ,private,protected 等。
下面给出示例:
// 自定义的数据类
public class MyData
{
// 1、类内部的公有委托
public delegate int MyD();
// 2、私有委托
private delegate int MyD1(int a);
// 3、受保护的委托
protected delegate int MyD2(string a);
}
// 类外部的委托
public delegate int MyD3();
public class MySubData:MyData
{
// 使用受保护的委托声明一个引用(该类继承自MyData,可以使用基类中公有和受保护的成员)
MyD2 a;
// 使用类外部的公有委托
MyD3 b;
}
public class Test
{
// 使用 MyData 类内部的公有委托,使用类名访问,声明一个委托类型的引用 a
public MyData.MyD a;
// 构造函数中初始化 a
public Test()
{
a = MyTest;
}
public int MyTest()
{
return 0;
}
}
注意:委托定义不能使用 static 修饰符,类内部定义的委托,公有的(public),其他类可以访问,需用类名指定,该类的派生类无需指定;私有的(private)只有该类的内部可以访问;受保护的(protected)该类和派生类可以访问。
下面是调用示例:
// 声明并初始化对象test
Test test = new Test();
// 调用委托,不为空时调用
if(test.a != null)
{
// 调用时的形式与调用方法一致
int result = test.a(); // result = 0
}
注意:委托初始化时,只需要将方法名赋值给委托引用即可,不需要使用 new 调用构造函数初始化。使用时可以像方法一样使用委托引用(前提是他不为空)。