我想知道是否有人可以概述我爲何要使用它們以及我在這個過程當中會得到什麼好處。 數據庫
確實,Partial Class用於自動代碼生成,一個用途能夠維護一個可能有數千行代碼的大類文件。 你永遠不會知道你的班級可能最終有10萬行,你不想建立一個具備不一樣名稱的新類。 編程
public partial class Product { // 50 business logic embedded in methods and properties.. } public partial class Product { // another 50 business logic embedded in methods and properties.. } //finally compile with product.class file.
另外一種可能的用途多是,不止一個開發人員能夠在同一個類上工做,由於它們存儲在不一樣的地方。 人們可能會笑,但你永遠不會知道它有時會不多。 安全
public partial class Product { //you are writing the business logic for fast moving product }
public partial class Product { // Another developer writing some business logic... }
但願它有意義! 編輯器
大多數人都認爲partial
應該只用於具備生成代碼文件或接口的類。 我不一樣意,這就是緣由。 函數
舉一個例子,讓咱們看看C#System.Math類......那是類 。 我不會嘗試將70多種方法所有放入同一個代碼文件中。 維持這將是一場噩夢。 佈局
將每一個數學方法放入單獨的部分類文件中,並將全部代碼文件放入項目中的Math文件夾中,組織將更加清晰。 this
對於具備大量不一樣功能的許多其餘類,一樣能夠/將會成立。 例如,用於管理PrivateProfile API的類可能會經過在單個項目文件夾中拆分爲一組乾淨的部分類文件而受益。 spa
就我的而言,我還將大多數人稱之爲「幫助」或「實用程序」類的內容拆分爲每一個方法或方法功能組的單獨部分文件。 例如,在一個項目中,字符串助手類有近50種方法。 即便使用區域,這將是一個長期笨拙的代碼文件。 對每種方法使用單獨的部分類文件進行維護要容易得多。 設計
在執行此操做時,我會當心使用部分類並在整個項目中保持全部代碼文件佈局的一致性。 例如將任何類公共枚舉和類私有成員放入文件夾中的Common.cs或相似命名的文件中,而不是將它們分散到文件中,除非它們僅特定於包含它們的部分文件。 code
請記住,將類拆分爲單獨的文件時,您也沒法使用文本編輯器拆分器欄,以便同時查看當前文件的兩個不一樣部分。
僅部分方法聲明即便代碼僅使用方法聲明進行編譯,而且若是不存在該方法的實現,編譯器也能夠安全地刪除該段代碼,而且不會發生編譯時錯誤。
驗證點4.只需建立一個winform項目並在Form1構造函數後面包含這一行並嘗試編譯代碼
partial void Ontest(string s);
在實現部分類時,須要考慮如下幾點: -
部分類跨越多個文件。
How can you use the partial modifier on a C# class declaration?
使用partial,您能夠將類物理地分紅多個文件。
這一般由代碼生成器完成。
例
使用普通的C#類,您沒法在同一項目中的兩個單獨文件中聲明一個類。
可是使用partial修飾符,你能夠。
若是一般編輯一個文件而另外一個文件是機器生成的或不多編輯,則此功能很是有用。
An Example will clear your concept.
class Program { static void Main() { A.A1(); A.A2(); } } //Contents of file A1.cs: C# using System; partial class A { public static void A1() { Console.WriteLine("A1"); } } //Contents of file A2.cs: C# using System; partial class A { public static void A2() { Console.WriteLine("A2"); } } Output A1 A2
這裏須要部分。
If you remove the partial modifier, you will get an error containing this text: [The namespace '<global namespace>' already contains a definition for 'A'].
提示:要解決此問題,您可使用partial關鍵字,也能夠更改其中一個類名。
How does the C# compiler deal with partial classes?
若是您反彙編上述程序,您將看到文件A1.cs和A2.cs被刪除。
你會發現A級存在。
IL反彙編程序因此:類A將在同一代碼塊中包含方法A1和A2。 這兩個類合併爲一個。
A1.cs和A2.cs的編譯結果:C#
internal class A { // Methods public static void A1() { Console.WriteLine("A1"); } public static void A2() { Console.WriteLine("A2"); } }
摘要
部分類能夠簡化某些C#編程狀況。
在建立Windows窗體/ WPF程序時,它們一般在Visual Studio中使用。
機器生成的C#代碼是獨立的。
或者你能夠在這裏找到整個描述。
如下列出了部分類的一些優勢。
您能夠將UI設計代碼和業務邏輯代碼分開,以便於閱讀和理解。 例如,您正在使用Visual Studio開發Web應用程序並添加新的Web表單,而後有兩個源文件「aspx.cs」和「aspx.designer.cs」。 這兩個文件與partial關鍵字具備相同的類。 「.aspx.cs」類具備業務邏輯代碼,而「aspx.designer.cs」具備用戶界面控制定義。
使用自動生成的源時,能夠將代碼添加到類中,而無需從新建立源文件。 例如,您正在使用LINQ to SQL並建立DBML文件。 如今,當您拖放表時,它會在designer.cs中建立一個部分類,而且全部表列都具備該類中的屬性。 您須要此表中的更多列才能在UI網格上綁定,但您不但願向數據庫表添加新列,所以您能夠爲此類建立一個單獨的源文件,該文件具備該列的新屬性,它將是一個偏僻的階級。 這確實會影響數據庫表和DBML實體之間的映射,但您能夠輕鬆得到額外的字段。 這意味着您能夠本身編寫代碼而不會弄亂系統生成的代碼。
多個開發人員能夠同時爲該類編寫代碼。
您能夠經過壓縮大型類來更好地維護應用程序。 假設您有一個具備多個接口的類,所以您能夠根據接口實現建立多個源文件。 易於理解和維護源文件具備部分類的接口。