[.NET C#] Partial Classes 部份類別

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