zoukankan      html  css  js  c++  java
  • 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. 举例说明。
  • 相关阅读:
    数学趣题——汉诺塔
    数学趣题——选美比赛
    数学趣题——计算组合数
    (结构型模式)Proxy——代理模式
    SHELL脚本的基础知识2——使用结构化命令
    数学趣题——寻找假币
    Cocoa使用自定义对话框的方法
    回调函数
    ObjectiveC 内存管理(转)
    mac 密码输入框控制——只能输入数字和字母,禁止特殊字符的输入
  • 原文地址:https://www.cnblogs.com/0ffff/p/7418389.html
Copyright © 2011-2022 走看看