游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1177|回复: 1

C#中Delegate浅析与思考 wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2008-12-16 19:36:00 | 显示全部楼层 |阅读模式
原 作 者:不祥
原 出 处:Linux中国
发 布 者:hanming
  
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. 其他

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

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-12-17 15:23:00 | 显示全部楼层

Re:C#中Delegate浅析与思考 wxh zt

概念就错了

delegate是函数的对象包装,而不是函数,既可以包含closure,也可以包含普通函数
用C++的语法,普通函数就是像 return_type (*func)(param_type p)的类型的变量,也就是C#的静态方法;
而closure是像return_type (*class_type::method)(param_type p)的类型的变量加一个class_type类型对象的指针,类似于STL的functor但要更灵活。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 17:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表