委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。如果可到这里茫然了, 请先忽略。继续往下看。 看完例子再回头看一下delegate 的含义。 或者说了解delegate是什么(所谓认识事物先感性,然后再理性)。
一、实例化委托:一旦声明了委托类型,委托类型必须要通过new关键字来创建(相当于面向对象中的实例化一个对象),当创建委托时,传递到new语句中的参数就像方法的调用一样书写, 但是不带参数。如:
public delegate void PrintSting(string s); // 委托的声明
PrintSting ps=new PrintString(WriteToScreen);//实例化委托。
二、范型委托:为了方便使用,微软事先定义好了三个范型委托。分别是Predicate、Action和Func
1、Predicate定义:
public delegate bool Predicate<T>(T obj);
这个委托只能传入一个参数,并且如参的类型由使用者自行提供,返回一个bool类型的值。
2、Action定义:
public delegate void Action<T>(T obj1,Tobj2,...);
这个委托代表了一类方法,可以由0——16个入参,入参类型由使用者自己确定。返回值类型为void(通俗来说就是不能由返回值)。
3、Func定义:
public delegate<T> Func<T>(T obj1,Tobj2,...);
这个委托同样代表了一类方法, 为了弥补了Action 返回值类型只能为void的不足,.net提供了Func范型委托,Func的入参最多由16个, 并且由返回值,其入参类型和返回值类型均由使用者确定。
4、Action和Func的异同点:
(1)、相同点,两者的入参类型由使用者提供,并且两者的入参的参数个数最多有16个。
(5)、不同点:Action的返回值类型只能是void。而Func的返回值类型时使用者自定义。
5、匿名方法:
本来呢委托定义(声明)好之后,还得再单独定义委托需要使用的方法。不如说你定义了一个计算器的委托, 你还需要重新写计算加减乘除的方法了来供计算器委托来使用。这时候我们就想到了匿名方法。用匿名方法就不需要再单独写加减乘除这些方法了,只需要在匿名方法的方法体内实现这些逻辑就好了。例子如下:
delegate int calculator(int x, int y); //委托类型
static void Main(string[] args)
{
//创建委托对象(确定与哪些方法进行绑定),委托实例名=new 委托名(某个类的方法,本例与加法向绑定
calculator Adding =delegate( int x, int y)
{
return x+y;
};
calculator Moveing = delegate(int x, int y)
{
return x - y;
};
calculator Multiply = delegate(int x, int y)
{
return x * y;
};
calculator Divide = delegate(int x, int y)
{
return x / y;
};
Adding(4, 4);//8
Moveing(4, 4);//0
Multiply(4, 4);//16
Divide(4, 4);//1
}