文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发C/C++《Effective C#》:用委托实现回调
精品推荐
特别推荐
·C语言编程易犯毛病集合
·C语言编程常见问题解答(目录)
·C#程序开发中的常用函数汇总
·C/C++笔试、面试题目大汇总
·Beej的网络socket编程指南
·socket编程原理
·C语言的常用库函数使用方法分析及用途
·在C语言中如何处理时间和日期
·C++设计模式之Singleton
·VC++动态链接库编程之MFC扩展 DLL
·TCP/IP网络重复型服务器通信软件的设计
·DirectX游戏开发入门
·经典与现代的结合:在MFC中集成RAD .NET框架
·Windows API-GDI入门基础知识详解(2)
·Visual C++ 入门精解
·C#基础概念二十五问
·用C#实现pdf文件的完整性验证
·成为嵌入式程序员应知道的0x10个问题
·TCP/IP编程实现远程文件传输
·几个C#编程的小技巧
热点TOP10
·学生成绩管理系统实习
·C#编写的windows计算器-源代码
·socket编程原理
·飞机订票系统设计
·C/C++笔试、面试题目大汇总
·TCP/IP编程实现远程文件传输
·Visual C++ 实现数字化图像的分割
·C语言图形函数
·改编 的 C版 职工管理系统
·C语言的常用库函数使用方法分析及用途
·C#基础概念二十五问
·C#源码读取excel数据到程序中-SQL SERVER-到dataset中
·用C语言实现Ping程序功能
·C# GridView 排序及分页
·进程调度模拟程序
·Windows下C语言网络编程快速入门
·通讯录的源代码(用链表实现)
·DirectX游戏开发入门
·在Visual Studio.NET中使用Crystal Report(上)
·asp.net中调用javascript函数实现多功能日期控件示例

《Effective C#》:用委托实现回调

日期:2007年8月16日 作者: 查看:[大字体 中字体 小字体]


  委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。

  那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两门语言,因此对委托的理解不是很深,对于委托可以简单的从字面去理解,即“委托别人去执行某些操作”,也就是说执行一个操作,而这个操作过程自身并不知道,只是委托过来让你去执行而已。

  参看如下这个例子。

public delegate void HelloHandler( string Msg );

private void SayHello( string sMsg )
{
 MessageBox.Show( sMsg );
}

// delegate sample

HelloHandler hHello = new HelloHandler( SayHello );
hHello( "Hello World!" );
  例子很明显,在执行hHello的时候,并不知道具体的过程是什么样的,只是去执行而已。

  现在要说说委托能做些什么,那么先来分析一下事件,这也是委托用得最多的地方。一般事件的初始化需要绑定一个事件处理函数,那么当事件触发的时候,处理函数会被调用,也就是说在事件处理函数可以明确的知道,此事件是被触发了。例如,点击窗体的上的Button,它会把Click事件反馈给窗体。很明显,委托是处理对象之间的信息交互。除了事件外,委托的大多用处都和此类似,那么这样使用的好处在于降低对象之间耦合性。

  其次委托不同于以前函数指针的地方在于,可以绑定多个委托函数,例如:

public delegate void HelloHandler( string Msg );

private void WriteHello1( string sMsg )
{
 Debug.WriteLine( "WriteHello1:" + sMsg );
}

private void WriteHello2( string sMsg )
{
 Debug.WriteLine( "WriteHello2:" + sMsg );
}

// delegate sample

HelloHandler hHello = new HelloHandler( WriteHello1 );
hHello += new HelloHandler( WriteHello2 );
hHello( "Hello World!" );
  不过在这种情况下,由于绑定到委托上的函数是按照顺序执行的,所以有两个潜在的问题。

  第一个问题,当一个函数执行过程中产生异常,导致后面的不能进行执行。就上面的例子而言,如果在“WriteHello1”函数中出现异常,会导致“WriteHello2”不能被执行。

  另一个问题,就是委托执行的返回值,当绑定多个函数,委托执行的返回值是最后一个绑定函数执行后的返回值,那么通过这个值去做判断将会是不正确的。

  那么对于委托绑定多个函数,要注意的是不要把异常扩散出来,其次委托类型的返回值为“void”。

  如何去使用委托,很多人看了书上的例子,也知道委托的意义,但是无法把它和实际应用进行结合。那么在使用委托的时候,首先要明白几个问题,等各个问题清楚了,委托原型也就自然出来了。

  需要分析清楚的问题有如下几点。

  问题一,传递信息是什么,传递的时机是否固定,一次传递还是多次传递;

  问题二,用委托是否合适;

  问题三,哪一方是委托的调用端,而哪一方是委托的初始端;

  问题四,委托的初始化放在哪里比较合适。

  问题一是关键,这首先决定是否要使用委托来实现,其次如果要使用委托,那么需要确定委托函数类型。

  对于问题二来说,很多人可能就不解了。没错,委托是可以降低类型之间的耦合性,但是能起到这种作用的并不是只有委托这一种方法。很多情况下,用重载构造函数即可以达到这一目的,因此想问题的时候,不能局限于此。例如,很多人都做过弹出一个单独窗体对某一条记录进行修改,这里用委托可以实现,但是考虑到DataRow属于引用类型,而这个窗体脱离了数据记录就失去了意义,因此可以重载构造函数,在初始化窗体的时候,把记录传递给窗体就行了。相对而言,后者会更简单直接些。

  有了前两个问题的分析,不少人在写委托的时候,会把顺序写反了,因此程序执行的效果并不是设想中的那样,这一点要尤为注意。

  对于第四个问题来说,可以借鉴窗体的控件事件初始化部分代码,即委托的初始化采取就近原则,不过这不是唯一初始化的地方,这样写只是便于防止漏写。

  好了,对于委托大致说这么多,希望对大家有所帮助。

(出处:清风网络学院






上一篇:了解DB2数据库优化的几条策略

下一篇:利用C#远程存取Access数据库

《Effective C#》:用委托实现回调 相关文章:
·如何实现局域网打印机共享
·TCP/IP编程实现远程文件传输
·Visual C++ 实现数字化图像的分割
·ASP.NET购物车的实现及结算处理
·一个Struts实现分页,增删改查,Tiles,国际化的DEMO
·javascript+xml实现二级下拉菜单,不会被任何标签或元素遮住
·用C语言实现Ping程序功能
·windows 2003服务器配置VPN实现各种网络环境VSS协同开发
·让Windows XP操作系统实现全速启动
·如何实现一个表格表头不动tbody区域用滚动条可以滚动
《Effective C#》:用委托实现回调 相关软件:
·TCP-IP详解卷2:实现
·Effective Java 中文版
·ASP.NET的网站新闻管理系统设计与实现
·内置对象实现超酷日历
·ASP.NET下MVC设计模式的实现
·Effective Oracle by Design (code)
·Effective C++ Second Edition
·使用关键字实现上传木马
·数据库系统实现
·TCP-IP详解卷二:实现

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot