C# 2.0 開始支援了部份類別 (Partial Class) 的機制,即便在同一個Class底下也可以分別寫在不同的source code file裡,而在編輯時期在由編輯器合併為單一Class。這樣的設計讓開發上擁有更多的彈性,而在一個.NET專案中也到處可以看到Partial Class的影子 (WebForm的 aspx.cs, aspx.designer.cs即是以partial 方式撰寫)。
C# 2.0 開始支援了部份類別 (Partial Class) 的機制,即便在同一個Class底下也可以分別寫在不同的source code file裡,而在編輯時期在由編輯器合併為單一Class。這樣的設計讓開發上擁有更多的彈性,而在一個.NET專案中也到處可以看到Partial Class的影子 (WebForm的 aspx.cs, aspx.designer.cs即是以partial 方式撰寫)。
使用Partial Class的優點:
1. 可以依照功能別將檔案分割卻又屬於同一個類別底下。
2. 當SourceCode是自動產生時,我們具有擴充該類別的能力;卻又可以避免所增加的程式碼被自動產生工具給覆蓋。(ex: Entity Framework)
3. 多個開發者可以同步開發一個Class。
4. 程式美觀、不會落落長,即便實做多個Interface,類別下的程式碼可以在不同source file 實做不同的interface,避免一個類別程式碼過於冗長。
而使用Partial Class要注意的事項
1. 使用”Partial”關鍵字在所有的部份類別上。
2. 對應的partial class命名需相同,compiler才會編譯成相同Class
3. 對應的partial class 需要同一個命名空間(namespace)底下。
4. 對應的partial class需要同一個assembly / dll底下。
5. 對應的partial class需要有相同的存取修飾詞。
6. 如果一個partial class繼承了某個父類別,則代表所有partial class也繼承該類別。
7. 如果一個partial class實作了某個介面,則代表所有partial class也實作了該介面。
8. 如果一個partial class標示為Abstract或Sealed,則代表所有的partial class均為抽象且不可繼承。
以下我們就以Entity Framework來當例子,當我們藉由Database First拉出的POCO Model想要增加一個方法在這個類別中時,我們無法直接實作在原本的POCO Model上(沒有人會想在重新Sync Database時,辛苦寫好的Mehtod被蓋掉),此時我們可以增加一個Partial Class來實作。
public partial class Customers
{
public Customers()
{
this.Orders = new HashSet();
this.CustomerDemographics = new HashSet();
}
public string CustomerID { get; set; }
public string CompanyName { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string Country { get; set; }
}
藉EF以Northwind BD拉出的Customer類別,假設我們想寫一個FullAdderss Mehtod 來組成一個郵遞可使用的完整地址。
public partial class Customers
{
public string FullAddress()
{
return Address + " " + Region + "" + City + " " + Country;
}
}
此時我們可以新增一個Partial class來將欲實作的程式碼加入,實作FullAddress 方法(方式內容是亂寫的,純示範用)。
如此,我們在使用Customer這個Model時,就能直接呼叫FullAddress方法。
using (var db = new NorthwindEntities())
{
string fullAddress = db.Customers.Find(1).FullAddress();
}
參考資源
http://www.codeproject.com/Articles/313352/real-time-use-of-Partial-classes-and-partial-met
http://www.codeproject.com/Articles/709273/Partial-Classes-in-Csharp-With-Real-Example
https://msdn.microsoft.com/en-us/library/wa80x488.aspx