partial關鍵字允許把類、結構、方法或接口放在多個文件中。一般情況下,某種類型的代碼生成器生成了一個類的某部分,所以把類放在多個文件中是有益的。假定要給類添加一些從工具中自動生成的內容。如果重新運行該工具,前面所做的修改就會丟失。partial關鍵字有助於把類分開放在兩個文件中,而對不由代碼生成器定義的文件進行修改。
partial關鍵字的用法是:把partial放在class、struct或interface關鍵字的前面。在下面的例子中,SampleClass類駐留在兩個不同的源文件
SampleClassAutogenerated.cs和SampleClass.cs中: //SampleClassAutogenerated.cs
partial class SampleClass
{
public void MethodOne() { }
}
//SampleClass.cs
partial class SampleClass
{
public void MethodTwo() {}
}
編譯包含這兩個源文件的項目時,會創建一個SampleClass類,它有兩個方法MethodOne()和MethodTwo()。如果聲明類時使用了下面的關鍵字,則這些關鍵字就必須應用於同一個類的所有部分:
●public
●private
●protected
●internal
●abstract
●sealed
●new
●一般約束
在嵌套的類型中,只要partial關鍵字位於class關鍵字的前面,就可以嵌套部分類。在把部分類編譯到類型中時,屬性、XML註釋、接口、泛型類型的參數屬性和成員會合並。有如下兩個源文件:
//SampleClassAutogenerated.cs
[CustomAttribute]
partial class SampleClass: SampleBaseClass, ISampleClass
{
public void MethodOne() { }
}
//SampleClass.cs
[AnotherAttribute]
partial class SampleClass: IOtherSampleClass
{
public void MethodTwo() { }
}
編譯後,等價的源文件變成:
[CustomAttribute]
[AnotherAttribute]
partial class SampleClass: SampleBaseClass, ISampleClass, IOtherSampleClass
{
public void MethodOne() {}
public void MethodTwo() {}
}
注意: 儘管partial關鍵字很容易創建跨多個文件的巨大的類,且不同的開發人員處理同一個類的不同文件,但該關鍵字並不用於這個目的。在這種情況下,最好把大類拆分成幾個小類,一個類只用於一個目的。
部分類可以包含部分方法。如果生成的代碼應該調用可能不存在的方法,這就是非常有用的。擴展部分類的程序員可以決定創建部分方法的自定義實現代碼,或者什麼也不做。下面的代碼片段包含一個部分類,其方法MethodOne調用APartialMethod方法。APartialMethod方法用partial關鍵字聲明;因此不需要任何實現代碼。如果沒有實現代碼,編譯器將刪除這個方法調用:
//SampleClassAutogenerated.cs
partial class SampleClass
{
public void MethodOne()
{
APartialMethod();
}
public partial void APartialMethod();
}
部分方法的實現可以放在部分類的任何其他地方,如下面的代碼片段所示。有了這個方法,編譯器就在MethodOne內創建代碼,調用這裏聲明的APartialMethod:
// SampleClass.cs
partial class SampleClass: IOtherSampleClass
{
public void APartialMethod()
{
//實現方法APartialMethod
}
}
部分方法必須是void類型,否則編譯器在沒有實現代碼的情況下無法刪除調用。