C#分部方法的應用場景
C#分部方法的應用場景
C#分部方法和分部類型的初衷是類似的,一方面可以使得不同的開發者能夠同時編寫一個類型的不同部分,另一方面可以分離自動生成的代碼和用戶手寫的代碼。和分部類型一樣,分部方法也會在編譯初期被合并成一個方法定義。猜測:從微軟的角度來看,第二個“初衷”可能才是真正的初衷。
由此,分部方法有如下幾個應用場景:
場景1 出自In Case You Haven't Heard這篇文章
場景2 出自Visual Studio 2008的Linq to SQL技術
場景3 則是Anders Liu自已臆想出來的。
C#分部方法場景1 輕量級事件處理
有的時候,自動生成的代碼需要事件這類語言構造來通知用戶對某些操作進行處理,但實際上用于編寫的代碼就位于自動生成的類型之中。此時,或者需要觸發一個事件,或者就需要生成一個virtual方法來讓用戶繼承。但無論是事件還是繼承,開銷都是比較大的,所以可以通過分部方法來實現輕量級的處理方式。如下面的類:
- partialclassCustomer
- {
- stringname;
- publicstringName
- {
- get
- {
- returnname;
- }
- set
- {
- OnBeforeUpdateName();
- OnUpdateName();
- name=value;
- OnAfterUpdateName();
- }
- }
- partialvoidOnBeforeUpdateName();
- partialvoidOnAfterUpdateName();
- partialvoidOnUpdateName();
- }
這里定義了三個分部方法,其意義不言而喻。假設這是系統自動生成的代碼,則我們只需在另外一個源代碼文件中的partial class Customer中實現這幾個分部方法即可。
C#分部方法場景2 自定義DataContext中的Insert、Update、Delete方法
當使用Linq to SQL向項目中加入了實體類之后,還會創建一個XxxDataContext類,這個類繼承自DataContext類,并且是partial的。這個類封裝了具體的數據庫操作功能(實體類僅封裝數據庫中的數據),如對象的插入、更新和刪除等。
下面我們來看一下這個自動生成的類定義:
- publicpartialclassAdventureWorksDataContext:System.Data.Linq.DataContext
- {
- privatestaticSystem.Data.Linq.Mapping.
MappingSourcemappingSource=newAttributeMappingSource();- #regionExtensibilityMethodDefinitions
- partialvoidOnCreated();
- partialvoidInsertAWBuildVersion(AWBuildVersioninstance);
- partialvoidUpdateAWBuildVersion(AWBuildVersioninstance);
- partialvoidDeleteAWBuildVersion(AWBuildVersioninstance);
這里我們可以看到一系列的partial方法。其中第一個OnCreated實際上屬于場景1中描述的情況,是一個輕量級的事件,表示 DataContext環境對象創建完畢。而其他partial方法則用于自定義DataContext的IUD操作。對于每一個表(實體類),這里都會出現一組InsertXxx、UpdateXxx和DeleteXxx方法。如果我們希望自定義刪除行為(如希望將一個IsDelete字段設置為 true來表示已刪除),則可以在另一個文件中擴展這個partial類,并為對應的Delete方法提供實現聲明。
C#分部方法場景3 新的調試信息輸出方法
這是Anders Liu臆想的場景,在分部方法的協助下,我們可以寫出這樣的代碼:
- partialclassCA
- {
- partialvoidDebugPrint(stringmsg);
- ...
- voidF()
- {
- ....
- DebugPrint("aaa");
- }
- }
- partialclassCA
- {
- #ifDEBUG
- partialvoidDebugPrint(stringmsg);
- {
- Debug.WriteLine(msg);
- }
- #endif
- }
這樣做的好處在于,我們還是反過來說罷,如果不這樣做,必須在每次調用調試代碼時都加入#if判斷。而這樣可以將調試代碼都寫成方法,在一處用#if進行判斷。
缺點在于,由于分部方法必須是私有的,所以必須針對每個類寫一套調試代碼。以上介紹C#分部方法的應用場景。
【編輯推薦】