概述:
C#包括两种值类型:枚举,结构体及三种引用类型:类,委托和接口,委托是C#的五种基本数据类型之一。
委托[delegate]和事件[event]共同构成了C#中最复杂的语法机制。
一丶什么是委托:
顾名思义,“委托”是一件事,我们不去做,而是把这件事委托给其他人帮忙做;
在编程思想中,程序=数据+算法,在C#语言中,类的三种主要成员:字段(负责保存数据的),以及用于的属性(保护字段),方法(实现算法);
二丶为什么需要委托
原因1:在简单的程序中,似乎只需要简单的单独方法,而在一个复杂的算法中,方法之间存在大量互相调用的需求;
于是我们可以把符合某种特征的方法给抽象定义出来,人为约定:凡是符合这种特征的方法都可以被委托托管
托管是什么意思?
一是调用:委托可以用于调用方法,
二是封装集合:委托可以将方法封装以作为其它方法的参数;
三是约束:委托可以作为一种约束,限制方法的调用
来看个例子!
比如有一辆汽车需要组装:
假定组装某种型号的汽车包括五个具体的步骤:
1>.装配汽车底盘
2>.装配汽车轮毂
3>.装配汽车发动机
4>.装配汽车外壳
5>.装配汽车内饰
代码如下:
//定义一个汽车类(相当于图纸)
class Car
{
private string carName;
//重写构造函数
public string CarName
{
get { return carName; }
set { carName = value; }
}
//安装底盘
public void InstallChassis()
{
Console.WriteLine("底盘安装中...");
Console.WriteLine("底盘安装好了!\n");
}
public void InstallTyre()
{
int i = 0;
int[] Tyre = {1,2,3,4};
for(i=0;i<4; i++)
{
Console.WriteLine("轮胎{0}安装中...", Tyre[i]);
Console.WriteLine("轮胎{0}安装好了!",Tyre[i]);
}
Console.WriteLine("{0}个轮胎都安装好了!\n", Tyre.Length);
}
public void InstallMotor()
{
Console.WriteLine("发动机安装中...");
Console.WriteLine("发动机安装好了!\n");
}
public void InstallHull()
{
Console.WriteLine("外壳安装中...");
Console.WriteLine("外壳安装好了!\n");
}
public void InstallTrim()
{
Console.WriteLine("内饰安装中...");
Console.WriteLine("内饰安装好了!\n");
}
}
现在,我们要来制造一辆具体的车雷克萨斯LS200:
class Program
{
static void Main(string[] args)
{
Car car = new Car();
car.CarName = "雷克萨斯ES200";
car.InstallChassis();
car.InstallTyre();
car.InstallMotor();
car.InstallHull();
car.InstallTrim();
Console.ReadLine();
}
}
输出是这样的:
但是程序员们很懒:装配这件事其实没必要那么复杂,这五个具体的步骤其实都是为了服务雷克萨斯那个对象,这五个步骤其实是性质相同的事情.
在现实世界中,这种性质相同体现为都是工厂调用自己的“硬件”去完成的工作,而在程序中,这种“性质相同”则体现为:这五个方法的返回值都是空,且参数列表都为空
所以,我们把这五种方法抽象为同一类东西,这个东西就是委托,标准声明格式为:
delegate [返回值类型] [委托名称] (参数列表);
delegate int de(int x,int y);
现在我们为“制造雷克萨斯LS”声明委托:
//定义一种委托类型,这种委托可以封装参数列表为空,没有返回值的方法
delegate void InstallLEXUS();
委托作为类成员应该定义在类下,不能定义在方法体里
然后,我们可以实例化一个InstallLEXUS委托来封装装配雷克萨斯这个目标所需要的五个方法:
//声明了一个返回值为空,参数列表为空的委托
delegate void InstallCAR();
static void Main(string[] args)
{
Car car = new Car();
car.CarName = "雷克萨斯ES200";
InstallCAR InstallLEXUS = new InstallCAR(car.InstallChassis);
InstallLEXUS += car.InstallTyre;
InstallLEXUS += car.InstallMotor;
InstallLEXUS += car.InstallHull;
InstallLEXUS += car.InstallTrim;
InstallLEXUS();//使用委托
Console.ReadLine();
}
}
结果是,我们不用再和原来那样一个方法一个方法的调用了,我们直接调用这个委托就能实现一样的效果:我想大家大概已经发现了,委托,方法非常像,其实,委托的实例就是一种特殊的方法;委托可以将符合某种特征的方法抽象为一种数据类型,而当委托被实例化之后,委托的实例就是一个封装着其它方法的“oversize方法”。
我们使用这个“oversize”方法,更灵活,还随时增删内容以外,还有另外其他原因。
我们在接下来几篇中再说。
不足之处请指正。