討論C#分部方法
C#新增的特性中引起爭(zhēng)議的有許多,分部方法(Partial Method)算是一個(gè)。分部方法通常被定義在一個(gè)分部類中,在常規(guī)的類文件中也可實(shí)現(xiàn)。如果分部方法沒(méi)有被實(shí)現(xiàn),編譯器就不會(huì)對(duì)他們進(jìn)行編譯。
分部方法有著嚴(yán)格的限制。它們必須是私有的,不能返回值,不能有輸出參數(shù)。因?yàn)槿魏吾槍?duì)沒(méi)有被實(shí)現(xiàn)的分部方法的調(diào)用都會(huì)簡(jiǎn)單地被忽略,所以說(shuō)這些限制是非常有必要的。反過(guò)又意味著,分部方法不能作為一個(gè)明確分配的變量。Visual Basic也有分部方法,盡管VB不需要對(duì)變量的明確分配,它也有同樣的限制。
有那么多的限制,有人可能會(huì)問(wèn),“它們有什么優(yōu)點(diǎn)?”。這個(gè)問(wèn)題問(wèn)得好,基本上,C#分部方法僅被代碼生成器在處理輕量級(jí)事件的時(shí)候使用。就像 Alexander Jung所解釋的 :
分部方法通常(也可能是***相關(guān)的)的應(yīng)用場(chǎng)景就是在代碼生成的時(shí)候用于處理輕量級(jí)事件。假設(shè)你解析一個(gè)數(shù)據(jù)庫(kù)或者一個(gè)XML文件,然后生成了數(shù)據(jù)類,結(jié)果你會(huì)發(fā)現(xiàn)有數(shù)十個(gè)類、幾百個(gè)屬性以及一大堆泛型和模板文件等。分部方法另外一個(gè)經(jīng)常被用到的地方是驗(yàn)證,或者讓屬性的setter去更新另一個(gè)屬性。所以如果你要使用產(chǎn)生的代碼,或者在運(yùn)行時(shí)有幾百個(gè)事件和數(shù)千個(gè)方法調(diào)用的話( 其實(shí)大多數(shù)情況下只用到了其中的一點(diǎn)點(diǎn)),就讓分部方法來(lái)吧。分部方法在聲明和使用時(shí)要比事件容易得多,如果沒(méi)有用到它們,它們就會(huì)消失。
性能的提升并不是沒(méi)有代價(jià)的。從分部方法必須是私有的限制中,Alexander發(fā)現(xiàn)了它們的不足之處:
缺點(diǎn):如果你喜歡元數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用,并且已經(jīng)被ASP.NET的數(shù)據(jù)綁定所困擾時(shí)(因?yàn)闆](méi)有其他的方法可以附上元數(shù)據(jù))……那么,就準(zhǔn)備著在將來(lái)丟失信息吧。如果你需要為屬性的setter增加一些事件(基于跟蹤和調(diào)試的需要),如果你需要某個(gè)動(dòng)態(tài)的行為(比如附上某個(gè)通用規(guī)則引擎)等等,那么就讓我們祈禱代碼分析器的開(kāi)發(fā)人員能夠預(yù)知這個(gè)場(chǎng)景(或者已經(jīng)做好了準(zhǔn)備)吧。你有了一個(gè)清晰的層的分離,那么實(shí)體就應(yīng)該對(duì)UI一無(wú)所知嗎?是的,將代碼直接放到數(shù)據(jù)類中會(huì)破壞層的關(guān)系,但是你可以手動(dòng)地用分部方法實(shí)現(xiàn)真正的事件啊。
另外一些人對(duì)于C#分部方法也是憂慮重重,大部分是關(guān)于代碼設(shè)計(jì)器的使用的。Stefan Wenig寫(xiě)道:
首先,我不是非常熱衷于設(shè)計(jì)器。我憂慮的是設(shè)計(jì)器也許很快就會(huì)將我們送上過(guò)去基于COM開(kāi)發(fā)時(shí)的老路,數(shù)百個(gè)設(shè)計(jì)器和向?qū)Мa(chǎn)生了那么多沒(méi)人想去看的ATL和MCF代碼。在我們陷于設(shè)計(jì)器、創(chuàng)建的無(wú)用文件和復(fù)雜的構(gòu)建過(guò)程時(shí),使用Ruby的家伙們?cè)谛Γ驗(yàn)樗麄冇脦仔写a就可以解決(聯(lián)想一下上世紀(jì)90年代COM/C++和Java的比較)。難道對(duì)于基于代碼的開(kāi)發(fā)人員生產(chǎn)率不是C#所首要考慮的(看看VB的設(shè)計(jì)器驅(qū)動(dòng)的RAD路線圖)?我們不應(yīng)該再沉浸于基于設(shè)計(jì)器的,企業(yè)類庫(kù)思想的,樂(lè)于使用軟件工廠代碼設(shè)計(jì)器的幻想中了。團(tuán)結(jié)起來(lái),抵制它們!
Ayende Rahien也沒(méi)有嘴軟:
讓我們一起埋葬這些代碼設(shè)計(jì)器吧,豎起C#分部方法的輝煌墓碑!
【編輯推薦】