All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
打印选择区的文本(带html里规定的格式)_JavaScript技术_编程技术
Asp.net,MVC2.0初级教程-显示列表和内容页_[Asp.Net教程]
对PHP程序中的常见漏洞进行攻击_[PHP教程]
用javascript实现Base64编码_JavaScript技术_编程技术
GridView列数字、货币和日期的显示格式_[Asp.Net教程]
VS2005+Crystal,Report开发Web应用_[Asp.Net教程]
C#中的PrintDocument组件的属性的应用实例
Ajax实现页面loading效果!_[AJAX教程]
脚本实例:用,javascript,来操作字符串_JavaScript技术_编程技术
教你用PHP写MySQL数据库的用户认证系统_php资料_编程技术
Reading number is top 10 pictures
XuYing poker perspective garment debut
Flow chart of breast implants
再发两张抽象画
2012 national geographic daily picture2
From China fortress sora aoi3
青春清纯美女大集合1
奇趣的世界记录1
世界五大海盗
梦幻的风景
Li Zongrui hunting video screenshots2
Download software ranking
Tram sex maniac 2 (H) rar bag4
Sora aoi's film--cangkong_Blue.Sky
Wild things 2
Unix video tutorial20
Unix video tutorial7
变速齿轮3.26
Tram sex maniac 2 (H) rar bag12
The Bermuda triangle2
asp.net技术内幕
Tram sex maniac 2 (H) rar bag2
aaa published in(发表于) 2013/12/18 8:05:52 Edit(编辑)
《Effective,C#》之用委托实现回调_.net资料_编程技术

《Effective,C#》之用委托实现回调_.net资料_编程技术

《Effective C#》之用委托实现回调_.net资料_编程技术-你的首页-uuhomepage.com

  委托属于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属于引用类型,而这个窗体脱离了数据记录就失去了意义,因此可以重载构造函数,在初始化窗体的时候,把记录传递给窗体就行了。相对而言,后者会更简单直接些。


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


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


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





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.