程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#3.0的分部方法(3)

C#3.0的分部方法(3)

編輯:關於C語言

場景1:輕量級事件處理

有的時候,自動生成的代碼需要事件這類語言構造來通知用戶對某些操作進行處理,但實際上用於編寫的代碼就位於自動生成的類型之中。此時,或者需要觸發一個事件,或者就需要生成一個virtual方法來讓用戶繼承。但無論是事件還是繼承,開銷都是比較大的,所以可以通過分部方法來實現輕量級的處理方式。如下面的類:(本例子引用自前述的In Case You Haven't Heard一文)。

partial class Customer
{
string name;
public string Name
{
get
{
return name;
}
set
{ 
OnBeforeUpdateName();
OnUpdateName();
name = value;
OnAfterUpdateName();
}
}
partial void OnBeforeUpdateName();
partial void OnAfterUpdateName();
partial void OnUpdateName();
}

這裡定義了三個分部方法,其意義不言而喻。假設這是系統自動生成的代碼,則我們只需在另外一個源代碼文件中的partial class Customer中實現這幾個分部方法即可。

場景2:自定義DataContext中的Insert、Update、Delete方法

當使用Linq to SQL向項目中加入了實體類之後,還會創建一個XxxDataContext類,這個類繼承自DataContext類,並且是partial的。這個類封裝了具體的數據庫操作功能(實體類僅封裝數據庫中的數據),如對象的插入、更新和刪除等。

下面我們來看一下這個自動生成的類定義:

[System.Data.Linq.Mapping.DatabaseAttribute(Name="AdventureWorks")]
public partial class AdventureWorksDataContext : System.Data.Linq.DataContext
{
private static System.Data.Linq.Mapping.MappingSource mappingSource
= new AttributeMappingSource();
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertAWBuildVersion(AWBuildVersion instance);
partial void UpdateAWBuildVersion(AWBuildVersion instance);
partial void DeleteAWBuildVersion(AWBuildVersion instance);
......

這裡我們可以看到一系列的partial方法。其中第一個OnCreated實際上屬於場景1中描述的情況,是一個輕量級的事件,表示 DataContext環境對象創建完畢。而其他partial方法則用於自定義DataContext的IUD操作。對於每一個表(實體類),這裡都會出現一組InsertXxx、UpdateXxx和DeleteXxx方法。如果我們希望自定義刪除行為(如希望將一個IsDelete字段設置為 true來表示已刪除),則可以在另一個文件中擴展這個partial類,並為對應的Delete方法提供實現聲明。

場景3:新的調試信息輸出方法

這是Anders Liu臆想的場景,在分部方法的協助下,我們可以寫出這樣的代碼:

partial class CA
{
partial void DebugPrint(string msg);
...
void F()
{      ....
DebugPrint("aaa");
}
}
partial class CA
{
#if DEBUG    partial void DebugPrint(string msg);
{
Debug.WriteLine(msg);
}
#endif
}

這樣做的好處在於,我們還是反過來說罷,如果不這樣做,必須在每次調用調試代碼時都加入#if判斷。而這樣可以將調試代碼都寫成方法,在一處用#if進行判斷。

缺點在於,由於分部方法必須是私有的,所以必須針對每個類寫一套調試代碼。

小結

嗯,總而言之,Anders Liu在這篇文章裡說的是分部方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved