委托的概念:
C#中的委托概念也就好比如一个对象,他是一个类(“委托是类类型” 这个事实将在 “委托本质“ 部分进行详细介绍),因为只有类才有对象的概念,这同时也体现了C#作为一门面向对象语言的特性。
C#中的委托可以理解为函数的一个包装,它使得C#中函数可以作为参数来被传递,这在作用上相当与其他类中的函数指针。类用函数指针回去函数的入口地址然后通过这个指针来实现对函数的操作。
委托的定义和方法的定义类似,只是在定义的前面多加了一个delegate关键字。下面就是一个委托的例子:
public delegate void MyDelegate(int para1,string para2);
委托能包装的方法是有一定限制的,例如能被前面的委托类型MyDelegate包装的方法需要满足一下条件:
- 方法的返回类型必须为void;
- 方法必须有两个参数,并且第一个参数应为int类型,第二个参数为string类型。
归纳起来,可以被委托包装的方法必须满足以下规则:
- 方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序;
- 方法的返回类型要和委托一致,注意,方法的返回类型不属于方法的一部分。
委托的使用:
通过委托的概念,我们也许已经对委托有所了解了,那么委托该怎么用呢?如何把一个函数包装成委托类型并作为参数进行分传递的呢?下面让我给大家一个例子。
//委托的使用演示
class Program
{
//1.受用delegate关键字来定义一个委托类型
delegate void MyDelegate(int para1, int para2);
static void Main(string[] args)
{
//2.声明委托变量d
MyDelegate d;
//3、实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
d = new MyDelegate(new Program().Add);
//4.委托类型作为参数传递给另一个方法
MyDelegate(d);
Console.Read();
}
//该方法的定义必须与委托定义相同,即返回int类型的参数
void Add(int para1,int para2)
{
int sum -para1 + para2;
Console.WriteLine("两个数的和为:" + sum);
}
//方法的参数是委托类型
private static void MyMethod(MyDelegate mydelegate)
{
//5.在方法中调用委托
mydelegate(1, 2);
}
}
从以上代码可以看出,使用委托的步骤为:定义委托类型->声明委托变量->实例化委托->作为参数传递给方法->调用委托。
下面是分析委托的具体使用过程。
- 定义委托类型:delegate void Mydelegate(type para1,type para2);。起定义方式类似于方法的定义,只是多了一个delegate关键字。
- 声明委托变量MeDelegate d;。既然委托是一种类型,那么可以使用委托来声明一个委托变量,相当于int a。
- 实例化委托:d = new MyDeletegate(obj.InstanceMethod);。第二步只是声明了委托变量,但并没有将它实例化。类的实例化使用new关键字来实现,而委托也属于类类型,所以委托的实例化也使用new关键字来进行的。这里需要注意的是,委托的实例化是用一个方法名(不能带左右括号)作为参数,并且该方法的定义必须符合委托的定义,即该方法的返回类型、参数个数和类型必须与委托定义中的一样。这样,前面三步就好比构造了一个类对象而方法InstanceMethod好比是其他类的方法。
- 做为参数传递给方法:MyMethod(d);。委托使得在C#中,可以把一个方法作为另一个方法的参数,而委托可以看作是一个包装方法的对象。
- 在方法中调用委托。MyMethod方法先调用委托,委托在调用方法InstaceMethod.
委托链:
前面介绍的都是委托封装一个方法的情况,理解为一个类只为另一个类所引用。C#中的委托也同样可以封装多个方法。C#中把封装多个方法的委托称作委托链。
委托链的使用:
委托链其实就是委托类型,只是委托链把多个委托链接在一起而已,也就是说,我们把链接连接了多个方法的委托称为委托链。