C#之委托

委托

  1. 什么是委托?
  2. 怎么使用委托?
  3. 委托的思考?

1. 委托的定义

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

在定义一个函数的时候,我们一般会给它传入参数。

我们设计了一个方法,传入a,b值,返回a,b的和。

public void Add(int a, int b)
{
    return a+b;
}

能不能把方法作为参数 传入到另外一个方法里呢?
我们定义了一个方法如下所示,它有三个形参:

  1. 整型的变量a ;
  2. 整型的变量b ;
  3. ***型的参数 Calculate;

函数体内调用方法 Calculate(a,b);

public void Cal (int a ,int b , *** Calculate)
{
    Calculate(a,b);
}
  • int 是 a的类型
  • int 是 b的类型
  • *** 是 Caculate的类型

我们把 *** 称为委托。我们 *** 起一个名字

如: CalculateDelegate

它和int 、string 相似 都是 一种类型名。

2. 委托的使用。

2.1. 声明委托

以下我们声明一种上例中的委托

public delegate void CalculateDelegate (int a,int b);

其中:

delegate 为委托关键字 ; void 为返回类型 ;CaculateDelegate为委托名称;int 为参数类型

利用这个语句声明了一个名字是CaculateDelegate的委托类型。

2.2. 委托实例化

CaculateDelegate  JiSuan      = new CaculateDelegate(Add);
委托类型           委托实例                         被委托的函数

当我们使用下边的方法的时候,需要传入实参。JiSuan相当于形参Calculate的实参。

public void Cal (int a ,int b , *** Calculate)
{
    Calculate(a,b);
}

我们在主函数中调用

Cal(5,6,jiSuan);

相当于被委托的函数做了以下运算:

Add(5,6);

3. 委托的思考。

我一直思考,为什么命名为 “委托”。
假设,我开了一个中介公司ServiceDelegate,专门给在校大学生提供各种服务(合法服务)。我需要他们的学号姓名,才能方便我的服务。

A的学号为 :001

B的学号为 :002

我开了一个中介服务公司,开拓了一个业务,给大学生找房子。

public delegate void ServiceDelegate (int numbers,string Name);

学生A可以自己找房子,但是他比较懒惰。

public void AFindWork (int numbers,string Name)
{
    Console.WriteLine("I am {0},I find a Work");
}

所以它来到我的中介公司,委托我帮他找房子,并把他的学号姓名给了我。
我把它(找房子)加入我的工作薄

ServiceDelegate list = new ServiceDelegate(AWantAWork);

因为我公司很强大,帮他找到了合适的房子

list(001,"A");

A找到房子后很开心,对我们的服务进行了五星好评,我们也获得一定的佣金。
所以我扩大了业务,新增了一个代替充值水卡的服务

public Delegate void NewServiceDelegate (string place)

突然有一天,A和他的好基友B来我的中介公司寻求帮助,嗯,这次不是租房子。他们都委托我的公司给他们去"地点1"给他们充值水卡。

学生A自己也可以充

public void AReCharge (string place)
{
    Console.WriteLine("I had rcharged at "+place );
}

学生B自己也可以充

public void BReCharge (int numbers, string Name)
{
    Console.WriteLine("I had rcharged at " +place);
}

但是他们都太懒,近墨者黑嘛,所以他们委托我帮他们充值。

NewServiceDelegate lists = new ServiceDelegate(AReCharge);
lists += new ServiceDelegate(BReCharge);

这个我很有经验的,所以,我很快就完成任务。并获得佣金。嘿嘿,他们肯定不知道我骗了他们。嘘。。。

lists(place)

嗯。。。我们公司可是正规的中介。


预告:

事件件处理机制

  1. 什么是事件?
  2. 事件的特点?
  3. 怎么自定义事件
  4. 举例说明。
posted @ 2017-08-23 15:25  0ffff  阅读(127)  评论(0编辑  收藏  举报