天天学C#-委托

对学过c/c++的来说,delegate就相当于函数指针,看下面的代码:

class Person

{

public Person(string name)

{

this.name=name;

}

//一些属性和方法

string name;

public void Eat(Food food);

}

Person类有一个Eat方法,对它的实例来说,张三,李四,王五都有他们自己的Eat方法

Person zhanSan,liSi,wangWu;

zhanSan=new Person(”张三”);

liSi=new Person(”李四”);

wangWu=new Person(”王五”);

我们可以通过定义一个委托来分别调用Eat方法

public void delegate Eat(Food food);

如果想调用zhanSan.Eat(food)

Eat zhanSanEat=new Eat(zhanSan.Eat);

其他类似:

Eat liSiEat=new Eat(liSi.Eat);

Eat wangWu=new Eat(wangWu.Eat);

这样调用zhanSanEat(food)就相当于调用zhanSan.Eat(food)

委托最有用的是委托链,如果张三,李四,王五共同进餐

则可以定义委托如下

//定义复合委托

Eat togetherEat;

//c#中通过“+“将方法Connect到委托,即将委托加到委托链中

//通过“-”将方法从委托链中删除

togetherEat=zhanSanEat+liSiEat+wangwuEat;

//张三,李四,王五一起吃西瓜

togetherEat(西瓜);

//不带张三,只有李四和王五吃

togetherEat=liSiEat+wangWuEat;

togetherEat(西瓜);

.net中的事件机制就是通过委托来实现的。

下面是C#技术揭密上的一段源代码,我加了一些注释,讲解了事件的实现机制

//InventoryManager类用于更新库存量,它也定义了当更新库存量时应该触发的事件,也就是说它发布一个委托由订阅者调用
//InventoryWatcher类定义的是订阅者,可以选择是否将自己添加到发布者的列表中,从而在更新库存时,得到通知
using System;

namespace DelegateEvents
{
//定义EventArgs的派生类,用来携带事件信息
class InventoryChangeEventArgs:System.EventArgs
{
public InventoryChangeEventArgs(string sku,int change)
{
this.sku=sku;
this.change= change;
}
string sku;
public string Sku
{
get{return sku;}
}
int change;
public int Change
{
get{return change;}
}
}
//发布者
class InventoryManager
{
//声明一个委托,两个参数必不可少,第一个是发布者对象,第二个一定要是EventArgs类或者其派生类
public delegate void InventoryChangeEventHandler(object source,InventoryChangeEventArgs e);
//定义该委托的事件实例(即委托链,用于订阅者将自己加到委托链中
public event InventoryChangeEventHandler OnInventoryChangeHandler;
//InventoryManager的方法,用于更新库存
public void UpdateInventory(string sku,int change)
{
if(0==change)
return;
//定义事件参数实例,传递sku和change信息
InventoryChangeEventArgs e=new InventoryChangeEventArgs(sku,change);
//判断委托链表是否为空,如果不空,说明有订阅者订阅
if(this.OnInventoryChangeHandler!=null)
{
Console.WriteLine("[InventoryManager.UpdateInventory] Raising event to all subscribers...\n");
//依次调用委托链表上的方法
this.OnInventoryChangeHandler(this,e);
}
}
}
//订阅者
class InventoryWatcher
{
//定义发布者
InventoryManager invnetoryManager;
public InventoryWatcher(InventoryManager inventoryManager)
{
Console.WriteLine("[InventoryWatcher.InventoryWatcher] Subscribing to InventoryChange event\n");
this.invnetoryManager=inventoryManager;
//将自己Connect到InventoryManager.InventoryChangeEventHandler委托
inventoryManager.OnInventoryChangeHandler+=new InventoryManager.InventoryChangeEventHandler(OnInventoryChange);
}
//订阅者的方法,用于在发布者更新库存量时调用
void OnInventoryChange(object source,InventoryChangeEventArgs e)
{
int change=e.Change;
Console.WriteLine("[InventoryManager.OnInventoryChange]\n\tPart'{0}' was {1} by {2} units\n",e.Sku,change>0?"increased":"decreased",Math.Abs(e.Change));
}
}
/// <summary>
/// 用委托实现事件机制实例
/// </summary>
class DelegateEvents
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//定义委托发布者对象
InventoryManager inventoryManager=new InventoryManager();

Console.WriteLine("[DelegateEvents.Main Instantiating subscriber object\n");
//定义订阅者对象
InventoryWatcher inventWatcher=new InventoryWatcher(inventoryManager);
inventoryManager.UpdateInventory("111 006 116",2);
inventoryManager.UpdateInventory("111 005 383",5);

Console.ReadLine();
}
}
}

以上只是自己的一点理解,很多地方都不成熟,可能举的例子也不恰当,欢迎指点,和大家共同学习

时间: 2024-11-05 12:27:02

天天学C#-委托的相关文章

还记得BackgroundWorker吗

打开电脑,突然想起来,昨天下午,有位仁兄和我讨论过一个事,不妨拿来说说. 她说她的 牛逼程序要处理一堆东东,要弄个进度条作提示,不过进度条是在另一个窗口中的,她的想法是,在开 始处理数据时弹出进度对话框,实时显示处理进度,当处理完成后关闭对话框.乍看起来其实不难,不 过她遇到了以下问题,故在群里提问. 1.模态对话框的问题. 这问题好办,一般来说, 要长时间来处理数据,应该考虑后台异步操作,用砖家的话讲就是多线程.不过她在显示窗口时调用了 ShowDialog方法,这样代码会一直停在那里,直到窗

java 应该才能学好?

问题描述 我学Java快半学期了,感觉什么都没学懂.就连一个基本的从键盘给变量赋值都不会,这么学啊. 解决方案 解决方案二:那你可能是没有悟性啊...解决方案三:多动手!看看书,慢慢的找到适合自己的学习java的方法,lz加油!解决方案四:那就先解决这个问题吧,除非你想放弃importjava.util.*;publicclassconsoleRead{publicstaticvoidmain(String[]args){Scannersca=newScanner(System.in);inti

盘点被骗财骗色的大明星

张曼玉1993年,娱乐圈传出张曼玉与房地产商朱学祺墨西哥秘密结婚的消息.张曼玉因信任朱学祺委托其代为投资,结果被骗了上千万港元,两人于1995年最终于分手收场.惨,骗财又骗色.张曼玉可以说是娱乐圈数一数二的大美人了,只是少了点智慧.从那后张曼玉就开始学习做个美貌与智慧的化身了. 该文章相关标签:明星商人 左侧蓝色链接即为文章标签 1:点击标签您能找到更多你想知道的相关信息. 2:您可以知道别人也在关注什么. 什么是标签? [上一页][1][2][3][4][5][6][下一页] 下一篇:李慧敏:

黑客的暴利生意:没有信仰,只有丧心病狂!

2011年12月21日上午,有黑客在网上公开了中国最大的开发者社区CSDN网站的用户数据库,600余万个注册邮箱账号和与之对应的明文密码泄露;12月22日,网上接着曝出人人网.天涯.开心网.多玩.世纪佳缘.珍爱网.美空网.百合网.178.7K7K等知名网站的用户账号密码遭公开泄露. 堪称中国互联网史上最大规模的据业内人士说,此次事件突破了以往黑客界的底线:只炫耀比技术或挣点小钱,不流传不散播.用户信息泄密事件,再次让大家对黑客以及其背后的隐秘的产业链产生了浓厚的兴趣.以下为一个黑客的口述. 盘下

大数据引领经济转型 大平台推动集聚发展

■编者按 今年是"十三五"的开局之年.新年伊始,南明区委八届五次全会提出,今后一段时间,南明区要努力建设创新型中心城区,确保率先在全省实现基本现代化. 如何实现目标?南明区将以"城市出形象.产业有支撑.环境获提升.文化有引领.民生得实惠"为主要抓手,总结经验.展望未来. 今起,本报推出系列报道,从产业发展.环境提升.民生改善等方面,展现南明区打造创新型中心城区的坚定步伐. 1月30日,走进南明大数据电商产业聚集区,装修工人正忙碌着,有的在调整门头标识,有的在安装玻璃

第十一回(二):琴房外度曲生慕意 书店里软语救阿四

(二)第十一回:琴房外度曲生慕意 书店里软语救阿四        却说这暑期补习已愈月余,阿四班上皆已熟悉,与那几位东庄同窗,平日里也是吸烟借火,彼此熟识.便与那刘鹏,嘉琪等在班上肆意喧哗.常于晚课上,见那女同窗有几分姿色,倘若平日里举止可爱,便时常要借书借作业的故意撩逗.这或有女学生,也见识过这几个名头,倘能用心处着,倒也不难成全佳话.无奈这班里龙盘虎踞,只是一样不足,如见那隔壁班"双花"郭姑娘,或王姑娘,每每让众位叹息.那几位只得以此取乐,说也凑巧,今日便遇上刺头.彼时林二班上有一

分享三亚QQ信息网如何利用QQ资源推广

中介交易 SEO诊断 淘宝客 云主机 技术大厅 题记:大家好,本期我们访谈的是三亚QQ信息网的站长.本次访谈,三亚QQ信息网站长给我们分享了他建站的一些经历从他分析本地的市场到建立这个网站到运营网站,希望可以给大家带去一些帮助. 主持人:请您先介绍下您与网站的故事吧. 三亚QQ信息网:读高中的时候,就开始天天学做网站,然后成绩一落千丈,最后考了个一般般的二本院校,后来学会做垃圾站,主要是美女图片网站,以及一些针对搜索引擎热门关键词的内容站,赚了点钱,美女图片网站做得还行,到了大四的时候,学校迁移

此时此刻 阿里巴巴一线的工作人员都在干嘛?

(本文作者:储晓颖,支付宝技术研发工程师) 就像一群人在证券所盯着股票大盘一样,看着红红绿绿的各种数字曲线跳动波动然后跟着兴奋紧张. 我就是做这些大盘的 所以--过来刷刷知乎缓解下情绪. 对我们这个岗位,双十一就像高考,而我每年都要复读,每年题目还都比去年难很多. 过完高峰来修改下: 系统没挂!哈哈哈哈哈哈哈 白天值班很轻松再来修改下: 本人一共历经5年双十一(是的,每一年我都参与了).数据很敏感,代码无国界,不匿名说一些技术上的感受,无伤大雅. 妄自揣测回答一个题主可能关心的问题,相信这个问题

天天加分张学庆制胜法宝:社区精细化

从2006年10月开出第一家店起,天天加分在创始人张学庆把握的节奏下开店速度一直很缓慢,目前共计31家店,全直营,上海29家,江苏2家.张学庆认为,母婴用品的消费需要提供客户体验,这正是实体店铺的优势所在,麻雀虽小,但是天天加分数年来销售额增长却是接连翻番,张学庆的法宝正在于便利店式的"社区精细化". "藏"在社区中 事实上,在天天加分加入之前,母婴用品行业已是群雄环伺:红孩子.乐友.丽家宝贝.爱婴室.妈妈好孩子.孩子王--彼此的路数也很相近:电子商务(电商频道).