資源描述:
《擴(kuò)展方法和分部方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、擴(kuò)展方法和分部方法 好久沒(méi)過(guò)來(lái)扯淡了,話說(shuō)這年頭還有偶遇的事情嗎?比如國(guó)慶回家的汽車上有個(gè)妹子要你qq,要你微信,想著法子跟你聊天,然后睡了一覺(jué),醒來(lái)發(fā)現(xiàn)腎不見(jiàn)了?小花絮小花絮,要是腎真沒(méi)了,也吹不了牛,敗不了火了,繼續(xù)言歸正傳。?一:擴(kuò)展方法????說(shuō)到擴(kuò)展方法,我想大家都已經(jīng)再熟悉不過(guò)了,也許你的解決方案中有無(wú)數(shù)個(gè)這樣的擴(kuò)展方法,自從有了Linq之后,我們的集合就再也不單純了。從下面的Linq類中,所有的方法都擴(kuò)展在IEnumerable上,恰恰我們的集合都繼承于IEnumerable接口下面。?然后我們?cè)诰幋a的時(shí)候就來(lái)
2、了很多這樣的擴(kuò)展方法。??那么現(xiàn)在問(wèn)題來(lái)了,學(xué)挖掘機(jī)技術(shù)哪家強(qiáng)o(∩_∩)o...??下面舉一個(gè)擴(kuò)展string類的一個(gè)Asint()方法,然后看看IL代碼都干了些什么?1namespaceConsoleApplication12{3classProgram4{5staticvoidMain(string[]args)6{7vars="123".AsInt();8}9}1011publicstaticclassStringExtension12{13publicstaticintAsInt(thisstringvalue,intd
3、efaultValue=0)14{15intresult;16if(!int.TryParse(value,outresult))17{18returndefaultValue;19}20returnresult;21}22}23}?IL代碼:?從IL的call指令可以看出,其實(shí)擴(kuò)展方法本質(zhì)上是調(diào)用靜態(tài)類StringExtension中的AsInt方法,所以可以看出其實(shí)這也是編譯器為了提高我們的開(kāi)發(fā)效率而提供的的一個(gè)語(yǔ)法糖而已,所以上面的寫(xiě)法同樣可以寫(xiě)成這樣,同樣可以看出下面的寫(xiě)法就麻煩了很多。1s=StringExtension
4、.AsInt("123");?那么下面又來(lái)了一個(gè)問(wèn)題,既然可以隨意擴(kuò)展,那么我能不能擴(kuò)展string類的任何一個(gè)方法?比如說(shuō)ToLower()?從下圖中我們可以得到答案,在vs的智能感知中顯示出的方法還是string自帶的方法,而不是我擴(kuò)展的方法,這就說(shuō)明編譯器在用方法的時(shí)候還是有優(yōu)先級(jí)的,正是因?yàn)橛辛诉@個(gè)優(yōu)先級(jí)的問(wèn)題,給我們帶來(lái)了一個(gè)很大的“版本控制問(wèn)題”,就比如我剛才擴(kuò)展的Asint()方法,如果后期的CLR版本中在String類中自己增加了Asint()方法的話,那我擴(kuò)展的Asint()方法從此就會(huì)被忘卻于天涯,所以這個(gè)問(wèn)題
5、要留一點(diǎn)心。?二:分部方法 ?說(shuō)起分部方法,你可能會(huì)問(wèn)它有什么應(yīng)用場(chǎng)景,畢竟在我們實(shí)際的編碼中很少使用到,到是分部類用的不少,所以啦,我必須找點(diǎn)場(chǎng)景出來(lái)。恰好在EF中還真給找到了。???具體怎么建一個(gè)EF文件就不說(shuō)啦,我們就看看EF生成的模板代碼。1publicpartialclassDataClasses1DataContext:System.Data.Linq.DataContext2{34privatestaticSystem.Data.Linq.Mapping.MappingSourcemappingSource=newA
6、ttributeMappingSource();56#region可擴(kuò)展性方法定義7partialvoidOnCreated();8#endregion910publicDataClasses1DataContext():11base(global::System.Configuration.ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString,mappingSource)12{13OnCreated();14}1516pub
7、licDataClasses1DataContext(stringconnection):17base(connection,mappingSource)18{19OnCreated();20}2122publicDataClasses1DataContext(System.Data.IDbConnectionconnection):23base(connection,mappingSource)24{25OnCreated();26}2728publicDataClasses1DataContext(stringconnecti
8、on,System.Data.Linq.Mapping.MappingSourcemappingSource):29base(connection,mappingSource)30{31OnCreated();32}3334publicDataCl