如果沒有寫實現聲明,則不會發射方法調用代碼,也不會對參數進行求值。因此,對於下面的例子:
class CA
{
partial void M(int i);
static void Main()
{
CA a = new CA();
int i = 0;
a.M(i++);
}
}
分部方法M只有定義聲明,沒有實現聲明,因此也不會發射調用該方法的代碼:a.M(i++),因此也不會對i++進行求值。所以最終i的值依然是0.但如果為M編寫了實現聲明,則a.M(i++)的代碼會被編譯到最終的程序集中,同時參數也被求值,i的值將被變為1。
分部方法只能出現在分部類中。
分部方法必須是私有(private)的,並且返回值類型必須是void。
分部方法可以帶有參數,並且其參數可以帶有this、params和ref修飾符,但不能帶有out修飾符。
分部方法不可以是虛擬(virtual)的。
分部方法不可以是外部(extern)的。
分部方法可以是靜態(static)的,也可以是不安全(unsafe)的。
分部方法可以是泛型方法,泛型約束必須放置在定義聲明中,但也可以在事先聲明中重復說明。在定義聲明和實現聲明中,類型參數和類型參數的名字不一定必須一致。
不能將分部方法封裝到一個委托中。
分部方法的應用場景
分部方法和分部類型的初衷是類似的,一方面可以使得不同的開發者能夠同時編寫一個類型的不同部分,另一方面可以分離自動生成的代碼和用戶手寫的代碼。和分部類型一樣,分部方法也會在編譯初期被合並成一個方法定義。猜測:從微軟的角度來看,第二個“初衷”可能才是真正的初衷。
由此,分部方法有如下幾個應用場景:(場景1 出自In Case You Haven't Heard這篇文章「http://blogs.msdn.com/wesdyer/archive/2007/05/23/in-case-you- haven-t-heard.ASPx),場景2出自Visual Studio 2008的Linq to SQL技術,而場景3則是Anders Liu自已臆想出來的。