浅谈C#中委托(delegate)

概述:

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”方法,更灵活,还随时增删内容以外,还有另外其他原因。
我们在接下来几篇中再说。

不足之处请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值