1. 程式人生 > >C#類和物件(八)——部分類

C#類和物件(八)——部分類

        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型別,否則編譯器在沒有實現程式碼的情況下無法刪除呼叫。