首页 (精心整理)Delegate来谈C#

(精心整理)Delegate来谈C#

举报
开通vip

(精心整理)Delegate来谈C#Delegate来谈C#Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理。这两天,我再度翻阅了一些关于Delegate的资料,并开始正式整理这个C#中著名的特性。本文将由浅入深的谈一下Delegate这个特性。一.Delegate是什么?Delegate中文翻译为“委托”。Msdn中对Delegate的解释如下:C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传...

(精心整理)Delegate来谈C#
Delegate来谈C#Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理。这两天,我再度翻阅了一些关于Delegate的 资料 新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单 ,并开始正式整理这个C#中著名的特性。本文将由浅入深的谈一下Delegate这个特性。一.Delegate是什么?Delegate中文翻译为“委托”。Msdn中对Delegate的解释如下:C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。如果你是第一次接触Delegate这个概念,你可能会对上面这段文字感觉不知所云,不过不要紧,你可以先把Delegate认为就是一个函数指针。而当你面对一个虚无的概念时,最好的应对方法就是直接看实例。下面一个简单的Delegate使用例子。classProgram{staticvoidOtherClassMethod(){Console.WriteLine("Delegateanotherclass'smethod");}staticvoidMain(string[]args){vartest=newTestDelegate();test.delegateMethod=newTestDelegate.DelegateMethod(test.NonStaticMethod);test.delegateMethod+=newTestDelegate.DelegateMethod(TestDelegate.StaticMethod);test.delegateMethod+=Program.OtherClassMethod;test.RunDelegateMethods();}}classTestDelegate{publicdelegatevoidDelegateMethod();//声明了一个DelegateTypepublicDelegateMethoddelegateMethod;//声明了一个Delegate对象publicstaticvoidStaticMethod(){Console.WriteLine("Delegateastaticmethod");}publicvoidNonStaticMethod(){Console.WriteLine("Delegateanon-staticmethod");}publicvoidRunDelegateMethods(){if(delegateMethod!=null){Console.WriteLine("---------");delegateMethod.Invoke();Console.WriteLine("---------");}}}上面是一个Delegate的使用例子,运行看看结果吧。下面我稍微解释一下:【1】publicdelegatevoidDelegateMethod();这里声明了一个Delegate的类型,名为DelegateMethod,这种Delegate类型可以搭载:返回值为void,无传入参数的函数。【2】publicDelegateMethoddelegateMethod;这里声明了一个DelegateMethod的对象(即,声明了某种Delegate类型的对象)。区分:DelegateMethod是类型,delegateMethod是对象。【3】为什么上面说Delegate可以看做是函数指针呢?看下面这段代码:test.delegateMethod=newTestDelegate.DelegateMethod(test.NonStaticMethod);test.delegateMethod+=newTestDelegate.DelegateMethod(TestDelegate.StaticMethod);test.delegateMethod+=Program.OtherClassMethod;这里delegateMethod搭载了3个函数,而且可以通过调用delegateMethod.Invoke();运行被搭载的函数。这就是Delegate可以看作为函数指针的原因。上面这段代码中,delegateMethod只能搭载:返回值为void,无传入参数的函数(见:NonStaticMethod,StaticMethod,OtherClassMethod的定义),这和Delegate类型声明有关(见DelegateMethod的声明:publicdelegatevoidDelegateMethod())。【4】Delegate在搭载多个方法时,可以通过+=增加搭载的函数,也可以通过-=来去掉Delegate中的某个函数。二.Delegate和C++中函数指针的区别Delegate和C++中的函数指针很像,但如果深入对比,发现其实还是有区别的,区别主要有三个方面(参考StanleyB.Lippman的一篇文章)1)一个delegate对象一次可以搭载多个方法(methods),而不是一次一个。当我们唤起一个搭载了多个方法(methods)的delegate,所有方法以其“被搭载到delegate对象的顺序”被依次唤起。2)一个delegate对象所搭载的方法(methods)并不需要属于同一个类别。一个delegate对象所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有static也有non-static,可以由一个或多个不同类别的成员组成。3)一个delegatetype的声明在本质上是创建了一个新的subtypeinstance,该subtype派生自.NETlibraryframework的abstractbaseclassesDelegate或MulticastDelegate,它们提供一组publicmethods用以询访delegate对象或其搭载的方法(methods),与函数指针不同,委托是面向对象、类型安全并且安全的。看完上面关于Delegate的介绍,相信大家对它也有所了解了,下面我们将进行更深入地讨论!三.Delegate什么时候该用?看完上面的介绍,你可以会有一些疑问,为什么会有Delegate?实际中什么时候会用到?什么时候应该去用?在回答这些问题之前,大家可以先看看下面这段代码:classProgram{staticvoidMain(string[]args){varcar=newCar(15);newAlerter(car);car.Run(120);}}classCar{publicdelegatevoidNotify(intvalue);publiceventNotifynotifier;privateintpetrol=0;publicintPetrol{get{returnpetrol;}set{petrol=value;if(petrol<10)//当petrol的值小于10时,出发警报{if(notifier!=null){notifier.Invoke(Petrol);}}}}publicCar(intpetrol){Petrol=petrol;}publicvoidRun(intspeed){intdistance=0;while(Petrol>0){Thread.Sleep(500);Petrol--;distance+=speed;Console.WriteLine("Carisrunning...Distanceis"+distance.ToString());}}}classAlerter{publicAlerter(Carcar){car.notifier+=newCar.Notify(NotEnoughPetrol);}publicvoidNotEnoughPetrol(intvalue){Console.ForegroundColor=ConsoleColor.Red;Console.WriteLine("Youonlyhave"+value.ToString()+"gallonpetrolleft!");Console.ResetColor();}}看完了上面的代码后,你可能会问:为什么不在publicintPetrol中直接调用Alerter.NotEnoughPetrol呢?因为Car模块和Alerter模块本身是两个独立的子系统,如果直接调用,耦合性就会增加,这不是我们愿意看到的。其实以上的代码是设计模式中的观察者模式(观察者模式又称Source/Listener模式)的实现,当汽车在运行中汽油量<10时,警报器便会发出警报。在上面代码中,Delegate相当于一个存放回调函数的函数指针,使用Delegate,我们可以非常方便地实现观察者模式。而其实,在需要使用回调函数时,我们都可以考虑使用Delegate。不知道你有没有发现在上面的代码中还有一个问题呢?publiceventNotifynotifier;上面的代码中,我们定义了一个Event,而事实上:publicNotifynotifier;这样写,也完全可以满足我们的需求,这就引出了我们的另一个问题,Delegate和Event!四.Delegate与Event【1】Delegate和Event的关系看微软的代码时,我们会发现Delegate和Event这两个关键字经常会一起出现!究竟他们是什么关系呢?在Msdn中,有一段话描述Delegate和Event之间的关系,其实很简单:声明事件:若要在类内声明事件,首先必须声明该事件的委托类型。【2】Delegate和Event配合使用的效果看下面几幅图,这是我从一个C#的Application程序截下来的:HYPERLINK"http://images.cnblogs.com/cnblogs_com/hyddd/WindowsLiveWriter/baa965523e4a_207B/3_2.jpg"INCLUDEPICTURE"http://pic002.cnblogs.com/img/hyddd/200907/2009072620432252.jpg"\*MERGEFORMATINCLUDEPICTURE"http://pic002.cnblogs.com/img/hyddd/200907/2009072620434951.jpg"\*MERGEFORMAT从上图看到,在响应图形界面的操作中,我们用到了Event和Delegate,相信这也我们使用Event和Delegate最频繁的地方了。这里我还想罗嗦一下,平时需要我们自己写代码的界面事件响应函数,如:button_Click(…),其实都是回调函数,在自动生成的文件Form1.Designer.cs中,VS把事件和其对应的回调函数(即:button_Click(…)等)关联起来,当触发某事件时,对应的回调函数便会执行。【3】“publicNotifynotifier”和“publiceventNotifynotifier”的区别   关于这个问题,我们直接ildasm看看IL代码吧:>“publicNotifynotifier”的IL代码,如图:“publiceventNotifynotifier”的IL代码,如图:差别其实已经很明显了,“publicNotifynotifier”相当于Class里面的Field,访问级别是public,而“publiceventNotifynotifier”则相当于Property,访问级别是private!由于以上的差别,他们在某些使用上,会稍有不同,详细的可参考shensr写的《delegatevs.event(​http:​/​​/​www.evget.com​/​shensr​/​archive​/​2005​/​11​/​24​/​283653.html​)》。五.Delegate中的Invoke与BeginInvoke方法  简单说一下,Invoke与BeginInvoke都是执行Delegate里的搭载函数,而不同的是:Invoke是一个同步方法,BeginInvoke是一个异步方法。关于这个,有一篇文章《InvokeandBeginInvoke(​http:​/​​/​www.evget.com​/​worldreason​/​archive​/​2008​/​06​/​09​/​1216127.html​)》,对此介绍的比较详细,这里就不多说了。六.小结      回顾一下,到底什么时候我们可能会用到Delegate:【1】.当我们在C#中需要类似函数指针这样东西时。【2】.当我们需要使用回调函数的时候。【3】.需要异步调用的时候。【4】.实现观察者模式的时候。【5】.处理事件响应的时候。PAGE/NUMPAGES
本文档为【(精心整理)Delegate来谈C#】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
夕夕资料
拥有专业强大的教研实力和完善的师资团队,专注为用户提供合同简历、论文写作、PPT设计、计划书、策划案、各类模板等,同时素材和资料部分来自网络,仅供参考.
格式:doc
大小:180KB
软件:Word
页数:0
分类:互联网
上传时间:2021-03-29
浏览量:3