C#中委托的简单解释.doc_第1页
C#中委托的简单解释.doc_第2页
C#中委托的简单解释.doc_第3页
C#中委托的简单解释.doc_第4页
C#中委托的简单解释.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

委托委托应该是c#里面比较难理解的方面之一,所以成为很多项目经理面试员工的常问问题,下面是从网上看到的一篇文章,写的不错很形象,所以引过来,然后在说明一下委托的用处。/比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。 /你命令小王,如果小张玩游戏,则小王扣去小张500元钱。 /这就是现实中的委托。 /实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。 /小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。 /而小王就是事件处理对象,他负责把小张的钱扣除500。 /所以,委托有如下几个要素: /1 激发事件的对象-就是小张 /2 处理对象事件的对象-就是小王 /3 定义委托,就是你让小王监视小张。 /如果这三个要素都满足的话,则你就写出了一个完整事件的处理。 /下面有个例子:在2003 C#控制台应用程序编辑运行成功: using System;namespace CSharpConsole public class 场景 STAThread public static void Main(string args) Console.WriteLine(场景开始了.); / 生成小王 小王 w = new 小王(); / 生成小账 小张 z = new 小张(); / 指定监视 z.PlayGame += new PlayGameHandler(w.扣钱); / 开始玩游戏 z.玩游戏(); console.writeline(场景结束.); Console.ReadLine(); / 负责扣钱的人 public class 小王 public 小王() Console.WriteLine(生成小王.); public void 扣钱(object sender, EventArgs e) Console.WriteLine(小王:好小子,上班时间胆敢玩游戏.); Console.WriteLine(小王:看看你小子有多少钱.); 小张 f = (小张)sender; Console.WriteLine(小张的钱: + f.钱.ToString(); Console.WriteLine(开始扣钱.); System.Threading.Thread.Sleep(500); f.钱 = f.钱 - 500; Console.WriteLine(扣完了.现在小张还剩下: + f.钱.ToString(); / 如果玩游戏,则引发事件 public class 小张 / 先定义一个事件,这个事件表示“小张”在玩游戏。 public event PlayGameHandler PlayGame; / 保存小张钱的变量 private int m_Money; public 小张() Console.WriteLine(生成小张.); m_Money = 1000; / 构造函数,初始化小张的钱。 public int 钱 / 此属性可以操作小张的钱。 get return m_Money; set m_Money = value; public void 玩游戏() Console.WriteLine(小张开始玩游戏了.); Console.WriteLine(小张:CS好玩,哈哈哈! 我玩.); System.Threading.Thread.Sleep(500); System.EventArgs e = new EventArgs(); OnPlayGame(e); protected virtual void OnPlayGame(EventArgs e) if (PlayGame != null) PlayGame(this, e); / 定义委托处理程序 public delegate void PlayGameHandler(object sender, System.EventArgs e); 实际上,委托的原理是获取一个窗体的句柄(窗体的指针),通过窗体的指针调用其方法,c#封装了c+的指针,使其更加安全和简单,但是指针封装了带来有些问题无法处理,于是出现了委托的概念。我所用到的委托有两个方面:(1)一个窗体(父窗体)中弹出另一个窗体(子窗体),子窗体中的事件触发父窗体的函数;如,从父窗体中弹出一个设置窗体,设置完毕点击ok按钮后,刷新父窗体。(2)一个窗体(父窗体)中弹出另两个窗体(子窗体1和子窗体2),子窗体1中的事件触发子窗体2中的函数;如,应用多文档窗体时候,一个子窗体中选择改变在另一个窗体中有所反映。第一种方式:代码如下:子窗体代码: public delegate void PlayGameHandler(int i); public event PlayGameHandler shijian; private void FormSon_Load(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e) shijian(4); 父窗体代码: private void FormParent_Load(object sender, EventArgs e) FormSon fs = new FormSon(); fs.shijian += new FormSon.PlayGameHandler(fs_shijian); fs.Show(); void fs_shijian(int i) MessageBox.Show(i.ToString(); ok,这样当在子窗体中单击按钮,父窗体会弹出消息框。第二种应用使用上面的方式可以解决。绿色通道:好文要顶关注我收藏该文与我联系 小Xu关注 - 0粉丝 - 2+加关注00(请您对文章做出评价)博主前一篇:数据库备份博主后一篇:NHibernateposted on 2009-02-09 12:02 小Xu 阅读(846) 评论(2) 编辑 收藏评论1887807#1楼楼主 2010-01-27 16:48 小Xu 定义代理private delegate vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论