Delegate的使用

 
1. 什么是托管函数 

托管函数是一个对类里面的某个函数的一个引用.它自己并没有具体的函数定义,只是指向某个函数实现. 

2. 与C++, Delphi的横向比较 

在C++和Delphi中与托管函数对应的类型是函数指针,形式如下: 

C++ 

typedef (int GetNum)(real rNum); 

Delphi 

function GetNum(rNum:real): integer; external; 

这里定义函数指针,他们所能指向的函数定义的传入参数必须是实型,传出为整形 


3. 托管函数有什么用 

由于托管函数是对类里面某个函数的一个引用.所以我们不必知道这个函数的具体名字是什么,而只需要调用托管函数,让托管函数去调用相应的函数就可以了. 一个例子: 一个公司,一个领导,一个领导秘书,三个员工分别管理市场,策划和生产.这里秘书就相当与一个托管函数, 领导要下达什么命令(获得市场信息,生产什么产品),只需要对秘书说给我一份市场报告或者我们不生产原子弹转向生产氢弹.然后再由秘书根据领导的命令选择的去找哪个员工,再把员工获得的信息返回给领导. 这里面三个员工对于领导是透明的,领导并不知道自己下达的命令具体是由谁执行的. 


4. 如何定义&&如何使用 

接着上面的例子,我们声明一个秘书托管函数原型 
class Secretory 

//定义托管函数原型 
private delegate string Do(string command); 
//创建托管函数实例 
public Do Doit; 
//给秘书下达命令执行 
public void ExecuteCommand(string command) 

switch(秘书根据命令判断是要给谁执行的) 

case 调研市场的人: 
Doit=new Do(new MarketMan().GetMarketInfo); 
Break; 
Case 生长产品的人: 
Doit=new Do(new ProductMan().ProduceProduct); 
Break; 
Default: 
Break; 


Doit(command); 

///调研市场的那个人的类 
class MarketMan 

public string GetMarketInfo(string command) 
{ 根据命令调查信息, 返回获得信息 ;} 
}
///生产产品的人 
class ProductMan 

public static string ProduceProduct(string command) 
{ 根据命令生产产品,并返回生产工程中的信息;} 

ok,那么如何执行呢?老板怎么使用Secretory这个类呢?
go on
老板只需要把秘书叫(new)过来,直接向他下达命令,然后就可以喝茶去了~ ^_^
class Boss 

public void static main() 

(new Secretory()).Doit(“我们要生产氢弹,把以前的原子弹都扔到日本好了”); 



5. 其他 

正入你们所见的,上面的两个类中的方法,一个是静态,一个不是静态的. 托管函数所指的函数可以静态的也可以不是静态的.

 

 

using System;

//C#中的委托类似于C或C++中的函数指针,但两者有本质区别:C或C++不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的。
//从技术角度来讲==>委托是一个引用类型,用来封装带有特定签名和返回类型的方法

namespace qinmi
{
    public delegate int mydelegateTest(int i, int j);//声明一个委托
    class calculate
    {
        public static int add(int i, int j)
        {
            return i + j;
        }
        public static int minus(int i, int j)
        {
            return i - j;
        }
    }

    class test
    {
        static void Main(string[] args)
        {
            mydelegateTest delegatehe = new mydelegateTest(calculate.add);//声明委托实例,并用calculate.add对其实例化,实际就是将委托和方法连接起来
            int he = delegatehe(100, 9);//开始调用委托,就像是使用静态成员方法calculate.add(int i,int j)一样
            Console.WriteLine("方法add的结果:{0}", he);

            mydelegateTest delegatecha = new mydelegateTest(calculate.minus);
            int cha = delegatecha(100, 9);
            Console.WriteLine("方法minus的结果:{0}", cha);
            Console.ReadKey();
        }
    }
}

一点心得:感觉NET比ASP多了点东西,编程思想虽然说是面向对象,不过最基本的还是一个逻辑在里面,多了的一些东西其实也就是把一些东西给封装了起来,调用就更加方便了,列给级别先,从大到小:命名空间->委托->方法->属性...大致就这样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值