· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

与C/C++指针相似的C#代表元及事件触发

发布时间:2005.05.17 16:27     来源:ChinaITLab    作者:ChinaITLab

代表元是C#中比较复杂的概念,C#中的代表元和C/C++中的函数指针非常相似使用代表元可以把代表元内部方法的引用封装起来然后通过它使用代表元引用的方法。

它有一个特性就是不需要知道被引用的方法属于那一个类对象只要函数的参数个数与返回类型与代表元对象一致。这样说可能比较抽象我下面举几个简单的例子希望能给广大初学者一些基本的认识。

//定义一个返回值为string的无参数的代表元
注意这个代表元只能引用对象中
返回值为string的无参数方法
  delegate string MyDelegate();
  public class MyClass
  {
  public string SayHello()
  {
  return "Hello the world!";
  }
  
  }
  public class TestMyClass
  {
  public static void Main(string[] args)
  {
  MyClass myClass1=new MyClass();
  MyDelegate myDelegate1=new MyDelegate(myClass1.SayHello);
  //下面就使用myDelegate1代替对象myClass1的SayHello方法
  System.Console.WriteLine(myDelegate1());
  //输出结果为hello the world!
与调用myClass1.SayHello();效果相同
  }
  }

如果代表元只有这点功能它就没有什么太大的用处了,代表元还有一个非常有用的功能就是定义复合代表元对象只有同样类型的代表元才能够复合起来 + 能定义复合代表元对象 - 从一个复合代表元中去掉一个代表元对象:

delegate void MyDelegate(string s);
  public class MyClass
  {
  public void SayHello(string who)
  {
  System.Console.WriteLine( who+"hello!");
  }
  public void SayGoodBye(string who)
  {
  System.Console.WriteLine( who+"good bye!");
  }
  
  }
  
  public class TestMyClass
  {
  public static void Main(string[] args)
  {
  MyClass myClass1=new MyClass();
  MyDelegate myDelegate,myDelegate1;
  myDelegate=new MyDelegate(myClass1.SayHello);
  myDelegate1=new MyDelegate(myClass1.SayGoodBye);
  myDelegate+=myDelegate1;
  //这样调用myDeletage就相当于同时调用了
myClass1.SayHello和myClass1.SayGoodBye
  myDelegate("love.net ");
  //执行结果输出love.net hello! love.net good bye!
  }
  }

事件驱动是windows应用程序的重要特征C#代表元就是用于产生事件,事件就是用于在一个组件中监听这个组件的变化。下面再举一个简单的例子:

//定义一个事件代理(代表元)
  public delegate void EventHandler
(string str);
  //定义事件源类
  class EventSource
  {
  //定义代表元作为事件源类的成员
  public event EventHandler Say;
  public void TriggerEvent()
  {
  if(this.Say!=null)
  //因为Say是个代表元所以执行Say方法
所做的实际操作由注册到它的事件处理函数决定
  Say("A event take place!");
  }
  }
  //测试
  class Test
  {
  public static void Main()
  {
  EventSource aEventSource=new EventSource();
  //注册事件处理函数为MyEvent 
显示一串字符类似于this.Click+=new 
EventHandler(Button1_OnClick);
  aEventSource.Say+=new EventHandler(MyEvent);
  //此处为演示事件触发过程所以就用程序自动触发
  //在图形界面应用程序中,一般由用户触发事件,
后由操作系统发送消息并调用处理函数 
所以程序员只要注册事件处理函数
  //和编写事件处理函数的代码其他就不用关心了
  aEventSource.TriggerEvent();
  }
  //事件处理函数
  public static void MyEvent(string str)
  {
  System.Console.WriteLine(str);
  }
  
  }

(T117)  


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 如何在Linux桌面上搭建C/C++IDE开发环境 (05-17) · 初学者必备:教你理解复杂的C/C++声明 (05-13)
· 编程秘籍篇:C语言高效编程的四大绝招 (05-13) · 细述C/C++字符指针数组及指向指针的含义 (05-13)
· 初学者编程入门:C++实用技巧讲解 (05-12) · 初学者编程入门:学习C++的最大难度 (05-12)
· 初学者编程入门:C++指针使用方法 (05-12) · 怎样使用Eclipse平台调试您的软件项目 (05-12)
· 感触C语言中的面向对象思想 (05-11) · 如何用PHP实现通过Web执行C/C++程序 (05-10)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:扭亏为盈 联想09年Q2翻番
·专题:Tech·Ed 2009微..
·直播:2009互联网大会..
·迅雷搜狐"互搏" 谁动了..
专题:诺基亚危局已现 或重蹈摩托覆辙
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
·专题:排排坐开商店 三..
商务演示需求分析 多媒体会议室必备投影
·VMware在京隆重举行2009..
·专题:笔记本频道10月热..
·专题:学生机市场 惠普 ..
专题:Tech.Ed 2009微软技术大会
·专题:2009 SYBASE 亚太..
·专题:微软新一代桌面操..
·专题:2009年第3届CSDN..