仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3822|回复: 19
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计C#事务与托付趣谈仓酷云

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:52 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听)事务与托付仿佛很难以了解,这是由于它们的利用体例与经常使用的编码有很年夜的不同,比方一般编写的都是同步代码,挪用一个范例的办法,会马上呈现办法实行的了局,这是切合逻辑的。但在某些情形中,同步代码一定满意需求,拿大众汽车来打个例如,假如交通控制中央但愿每辆公车抵达一个站点时都发送给本人一个旌旗灯号以便本人可以随时把握交通情况,利用同步代码,公汽对象一定必要挪用控制中央对象,如许就呈现了我们一向不肯意看到的情形:两个范例严密地耦合在一同。既然要别的范例对本人的举动作出反响,亲身挪用其范例的办法仿佛不成制止,在同步代码中,很难制止这类严密的范例挪用干系。
另外一个不同是在一样平常情形下,我们只将属性作为参数传送给办法,而很少会思索将一个办法传送给另外一个办法。
我们丢弃各类C#参考书中桀骜难明的事务与托付观点,假想一个情形来了解事务与托付的利用:有一家IT公司,董事长不但愿本人的雇员在下班工夫玩游戏,但又不成能时时刻刻都盯着每一个雇员,因而,他但愿利用一种新的体例完成监督雇员的效果:假如有雇员违背划定,某个设备或专门的监查职员将主动收回一个动静关照他,董事长只必要在事变产生时举行处置。

因而,这个用例实践上是两品种型——董事长类与雇员类——之间的交互,上面的代码将给读者展现怎样利用托付与事务机制完成这类交互:
起首,我们必要在董事长类与雇员类之间界说一个托付范例,用于传送二者之间的事务,这个范例就是一个监督设备或专门卖力打小呈报的监查职员:
publicdelegatevoidDelegateClassHandle();
界说一个托付的历程相似办法的界说,但它没无方法体。界说托付必定要增加关头字delegate。因为界说托付实践上相称一个类,因而能够在界说类的任何中央界说托付。别的,依据托付的可见性,也能够增加一样平常的会见润色符,如public、private和protected。
托付的前往值范例为void,这并不是暗示托付范例自己带有前往值,该前往值范例是指托付的方针函数范例,即它托付的一个事务处置函数前往值是void范例。
新建一个雇员类Employee,其代码以下:
publicclassEmployee{publiceventDelegateClassHandlePlayGame;publicvoidGames(){if(PlayGame!=null){PlayGame();}}}雇员类Employee代码中界说了一个DelegateClassHandle范例的事务PlayGame,它的界说体例也很特别,起首必需利用关头字event,暗示PlayGame是一个事务,同时还必需声明该事务的托付范例为DelegateClassHandle,行将出处该范例的托付对象卖力关照事务。假如有雇员入手下手玩游戏,它将实行Games办法,而只需该办法一被挪用,就会触发一个事务PlayGame,然后董事长就会收到这个事务的动静——有人在玩游戏了。董事长类代码以下,他有一个办法Notify用于吸收动静:publicclassAdmin{publicvoidNotify(){System.Console.WriteLine("someoneisplayinggame");}}Employee的PlayGame事务怎样与Admin的Notify办法联系关系起来呢?只需经由过程事务绑定便可完成,详细历程以下列代码:Employeeemployee=newEmployee();Adminadmin=newAdmin();employee.PlayGame+=newDelegateClassHandle(admin.Notify);employee.Games();请人人注重事务绑定的代码:employee.PlayGame+=newDelegateClassHandle(admin.Notify);经由过程DelegateClassHandle将两个类的交互举行了绑定,当employee.Games办法挪用后,触发PlayGame事务,而该事务将被托付给admin的Notify办法处置,关照董事长有雇员在下班工夫玩游戏。但董事长其实不满意这类复杂的关照,他还想晓得事实是谁在下班工夫违背划定。明显,如今托付对象必需传送需要的参数才行,这个请求也能够很简单地办到。事务的参数能够设置为任何范例的数据,在.NET框架中,还供应了事务参数基类EventArgs专门用于传送事务数据。从该EventArgs类派生一个自界说的事务参数类CustomeEventArgs,这个范例将照顾雇员姓名和岁数信息:publicclassCustomeEvetnArgs:EventArgs{stringname="";intage=0;publicCustomeEvetnArgs(){}publicstringName{get{returnthis.name;}set{this.name=value;}}publicintAge{get{returnthis.age;}set{this.age=value;}}}修正托付范例DelegateClassHandle的界说,让其照顾需要的参数:publicdelegatevoidDelegateClassHandle(objectsender,CustomeEvetnArgse);雇员类的代码修正后以下:publicclassEmployee{privatestring_name;publicstringName{get{return_name;}set{_name=value;}}privateint_age;publicintAge{get{return_age;}set{_age=value;}}publiceventDelegateClassHandlePlayGame;publicvoidGames(){if(PlayGame!=null){CustomeEvetnArgse=newCustomeEvetnArgs();e.Name=this._name;e.Age=this._age;PlayGame(this,e);}}}在Games办法中,起首新建一个CustomeEventArgs对象,然后设置了需要的属性Name和Age。董事长的关照办法也必需响应地举行修正:publicclassAdmin{publicvoidNotify(objectsender,CustomeEvetnArgse){System.Console.WriteLine(e.Name+"is"+e.Age.ToString());}}将两个范例对象举行联系关系的代码也必要举行响应的修正:Employeeemployee=newEmployee();employee.Name="Mike";employee.Age=25;Adminadmin=newAdmin();employee.PlayGame+=newDelegateClassHandle(admin.Notify);employee.Games();修正后的代码运转的了局是,当Mike挪用Games办法玩游戏时,会主动触发PlayGame事务,而该事务照顾相干信息关照admin,后者的Notify办法将吸收到数据并输入“Mikeis25”,告知董事长是Mike,25岁,正在下班工夫玩游戏。托付是能够多路播送(Mulitcast)的,即一个事务能够托付给多个对象吸收并处置。在下面的用例中,假如有另外一位司理与董事长具有一样的嗜好,也能够让托付对象将雇员的PlayGame事务关照他。起首界说司理类:publicclassManager{publicvoidNotify(objectsender,CustomeEvetnArgse){System.Console.WriteLine(sender.ToString()+"-"+e.Name);}}司理Manager范例的Notify办法与Admin分歧,他也承受到响应的信息。托付的多路播送绑定的办法仍旧是利用+=运算符,其办法以下面的代码所示:Employeeemployee=newEmployee();employee.Name="Mike";employee.Age=25;Adminadmin=newAdmin();Managermanager=newManager();employee.PlayGame+=newDelegateClassHandle(admin.Notify);employee.PlayGame+=newDelegateClassHandle(manager.Notify);employee.Games();实行该办法,读者将看到admin和manager的Notify办法城市被事务关照并挪用实行。经由过程如许的办法,董事长和司理城市晓得Mike在玩游戏了。
假如董事长不但愿司理也收到这个关照,该怎样排除PlayGame对manager的事务绑定呢?一样十分复杂,在employee.Games办法被挪用前实行以下语句便可:
employee.PlayGame-=newDelegateClassHandle(manager.Notify);
最初必要提示读者注重的,Employee类中的Games办法在触发事务PlayGame之前必要判别该事务是不是为null。当employee对象的Games办法触发事务PlayGame后,必需有一个方针函数来处置这个事务,而该语句恰是判别该方针函数是不是存在。假如将这个判别往失落,且对事务不举行任何绑定而间接挪用Games办法,程序将在事务PlayGame处弹出一个NullReferenceException的非常。

读者可以从托付与事务的代码中得出甚么结论吗?两个必要存在挪用干系的范例,在各自的完成中却没有编写实践的挪用代码,它们只是经由过程一个事务和一个第三方的托付范例完成了动静的传送历程。两个范例之间不存在任何的严密耦合,它们看似松懈地经由过程一个托付对象中通讯,完成了本书一向宣扬的“高聚合”和“低耦合”概念。

来自:http://blog.csdn.net/chiangbt/archive/2008/01/17/2050174.aspx
无论谁倒了对双方阵营的粉丝们也是有害无益。
愤怒的大鸟 该用户已被删除
沙发
 楼主| 发表于 2015-4-10 06:59:40 | 显示全部楼层
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 17:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表